在使用Visual Studio 2008快乐地攻击这个C#应用程序几天后,我被一连串错误对话框显示:
属性" valueMember "的代码生成失败.
错误是:' 对象引用未设置为对象的实例.'
现在,当我在设计器中进行微小的更改时,例如将控件移动几个像素,然后尝试保存,就会发生这种情况.每秒都会出现几个这样的错误对话框,让我忙着取消所有这些,通过敲击Enter键同时尝试让alt-F4让VS关闭.
最终我确实让VS关闭并保存我所做的更改.重新启动VS后,我对整个项目进行"清理",然后"构建",一切正常,应用程序运行良好,没有问题.
直到我在表单设计器中进行了另一个细微的更改.
我不知道valueMember我的应用程序中的任何属性.
这让我很疯狂,这对我的项目来说是一个真正的表现.任何帮助表示赞赏.
虽然学习C#非常快,但我对这个Collection语法问题感到磕磕绊绊.
我将自己类型MyItem的一些对象添加到listbox lstData.现在我需要在这个列表框中搜索并想到使用优雅的LINQ表示法,如:
lstData.Items.Where(x => x.Text == SearchString)
Run Code Online (Sandbox Code Playgroud)
但是列表框的项目没有.Where(),尽管我确实包含了"using System.Linq;" 命名空间.
所以我尝试过:
foreach (MyItem item in (MyItem)lstData.Items)
Run Code Online (Sandbox Code Playgroud)
但这会产生构建错误:无法将类型'System.Windows.Forms.ListBox.ObjectCollection'转换为'MySandbox.frmListboxDemo.MyItem'.
我确实设法写了一些可行的东西:
for (int i = 0; i < lstData.Items.Count; i++)
{
MyItem item = (MyItem)lstData.Items[i];
if (item.Text == SearchString)
{
lstData.SetSelected(i, true);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
和类似的版本:
var item_enum = lstData.Items.GetEnumerator();
while (item_enum.MoveNext()) { etc etc... }
Run Code Online (Sandbox Code Playgroud)
结果证明是2行更长,并且没有找出什么可以取代'var'.
我不太确定我是否理解如何使用Collections,ObjectCollections,Enumerators等,但我很想学习.特别是如果.here()版本是可能的和/或更好的.
谢谢你的所有答案.我最终得到了这个解决方案:
var item_iter = lstData.Items.Cast<MyItem>()
.Where(x => x.Text.Trim().ToLower() == txtItemName.Text);
foreach (MyItem item in item_iter)
{
int i = lstData.Items.IndexOf(item);
lstData.SetSelected(i, true);
break;
} …Run Code Online (Sandbox Code Playgroud) 查看此解决方案以获得更好的自动滚动,我认为自己很聪明地找到了一个更简单的解决方案,但它仅适用于调试会话:
private void scrollviewer_Messages_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
ScrollViewer sv = sender as ScrollViewer;
if (sv.VerticalOffset == sv.ScrollableHeight)
{
sv.ScrollToEnd();//debug breakpoint
}
return;
}
Run Code Online (Sandbox Code Playgroud)
在此 ScrollViewer 中向文本块添加内容时,自动滚动工作,文本底部保持在视图中。当用户向上滚动并添加更多内容时,底部消失,自动滚动关闭,这很好。当用户滚动回底部时,ScrollToEnd() 应该重新打开自动滚动,但是当添加更多内容时,底部仍然滚动到视图之外。
当我设置断点时,我可以验证确实调用了 ScrollToEnd()。然后,在删除断点并添加更多内容后,自动滚动再次起作用。
我通过按下一个按钮来添加内容,在 ViewModel 和 Binding 中使用代码。所以我确定没有并发问题。添加内容和手动滚动之间有很多时间。
这真的让我感到困惑,而我对简单的自动滚动解决方案感到非常满意。这怎么行不通?
编辑:
我发现在滚动回底部后自动滚动再次起作用,但不知何故,真正到达底部并不那么容易。我需要向下移动滑块,然后单击滚动条的向下箭头。我现在将尝试替换==代码中的符号以允许几个像素差异。
编辑:
这个问题是否是由于内容是带有多行文本字符串和 TextWrap 的 TextBlock 引起的?
<ScrollViewer Name="scrollviewer_Messages" DockPanel.Dock="Top"
Height="100" Width="200"
ScrollChanged="scrollviewer_Messages_ScrollChanged">
<TextBlock Name="tb_Message"
Margin="10" TextWrapping="Wrap"
Text="{Binding Path=Messages}">
</TextBlock>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
编辑:
将事件处理程序中的公式更改为:
sv.ScrollableHeight - sv.VerticalOffset < 20
Run Code Online (Sandbox Code Playgroud)
我已经尝试过,< 10但是 pushpraj(见下面的答案)让我尝试了更大的数字。仍然不清楚为什么会这样,因为问题不是没有ScrollToEnd()被调用。
关于解决方案:
在<20没有必要的,因为它是关于小数。一般来说,两个实数永远不会相等,但这里不是真的。 …
我刚刚得到一个要处理的CSV输入文件,它在第一个分隔引号之前有一个等号,并想知道这是否有效并且有任何用途.示例(简化):
"2"
"3"
="4"
Run Code Online (Sandbox Code Playgroud)
在阅读了一些像这样的帖子后,我尝试了这样的CSV:
"2"
"3"
="A1+A2"
Run Code Online (Sandbox Code Playgroud)
和:
"2"
"3"
"=A1+A2"
Run Code Online (Sandbox Code Playgroud)
似乎Excel和LibreOffice默默地忽略引号之前的等号,并且很好地将引号后面的等号视为公式的标志.但是,我找不到任何关于此的文档.
(对于Excel,此CSV需要使用.txt扩展名保存,并使用control-O打开)
我倾向于在打开引号之前使用等号来调用CSV作为在阅读此文件时易于处理的错误,但仍然想知道是否还有更多关于此的说法.
安全性使我使用 NuGet 将 jQuery 从 3.2.1 升级到 3.6.0,将 bootstrap 从 3.3.7 升级到 5.0.1,并摆脱旧的手动安装的 jQuery/bootstrap 文件,现在我遇到了一些布局问题无法修复。
症状1
这里我有一个可见的按钮“切换导航”。以前,这个按钮是不可见的。我在 css 类上找到的信息sr-only说它应该在屏幕阅读器上不可见(向盲人计算机用户阅读屏幕内容),但我没有屏幕阅读器,而是 firefox/chrome 浏览器。我猜这个类应该只显示给屏幕阅读器。无论如何,这个按钮没有任何作用,所以我把它注释掉了。
<nav>
<div class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<!-- button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button -->
<a href="/" class="pull-left">
<img src="/Images/company_logo.png" />
</a>
<span id="span_pagetitle" class="pull-left span_pagetitle" runat="server">
Page Title
</span>
</div>
Run Code Online (Sandbox Code Playgroud)
仍然奇怪的是,Chrome 开发工具在 Elements、Styles 下显示它sr-only是由 bootstrap.min.css 处理的,但新的 Bootstrap5 由 _reboot.scss 处理。下划线表明这是一个临时文件,其扩展名与更高级别的 CSS …
尝试从使用BackgroundWorker升级到Task,我对如何在不调用Wait()的情况下保持后台作业运行感到困惑.
这是后台工作(简化):
private async Task RunAsync()
{
HttpResponseMessage response = await TheHttpClient.GetAsync(Path);
if (response.IsSuccessStatusCode)
{
textBox_Response.Text = await response.Content.ReadAsStringAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
单击"发送"按钮时,上面的代码应该运行,但由于后台代码有多个await异步调用,我猜Wait()需要多次调用:
private void button_Send_Click(object sender, EventArgs e)
{
Task t = RunAsync();
while (!t.IsCompleted)
{
t.Wait();
}
}
Run Code Online (Sandbox Code Playgroud)
但这会在后台作业的整个处理时间内阻止GUI.
如何启动后台作业并立即从按钮单击处理程序返回,同时允许后台作业运行所有异步调用?
我知道如何使用BackgroundWorker实现这一点,我不应该在这里使用任务吗?
我们之前在 IIS 服务器上配置了多个站点,但现在我们无法让第二个站点工作。IIS 安装在虚拟 Windows 机器上,以太网适配器分配了多个 IP 地址。
IIS 上的第二个站点绑定到这些 IP 地址之一,可以 ping 正常,但无法访问该站点。
我单击了开始,IIS 站点图标缺少指示已停止的黑点。
浏览器说:This page cannot be displayed建议检查IP地址。
随着netstat我发现没有进程监听的新的IP地址,这显然是一个问题。
我们已经尝试过重新启动 IIS,并在创建新的 IP 地址和新的 IIS 站点后重新启动整个虚拟 Windows 机器。
如何让 IIS 开始侦听为其第二个站点分配的 IP 地址?
我正在移动一些文件,但注意到 FileInfo.Exists 并没有真正起作用。在下面的示例中,将文件从“foo”移动到“bar”后,两个FileInfo对象似乎都是Exist. 在其他运行中,我发现两个 Exists 都是假的。
using System.IO;//File, FileInfo
public static void TestMoveTo()
{
// create file 1
string FileName = @"d:\temp\foo.txt";
File.WriteAllText(FileName, "Test file\n");
FileInfo FI_Test = new FileInfo(FileName);
// move to file 2
string NewFileName = @"d:\temp\bar.txt";
if (File.Exists(NewFileName))
File.Delete(NewFileName);
FileInfo FI_New = new FileInfo(NewFileName);
FI_Test.MoveTo(FI_New.FullName);
// test
bool OldExists = FI_Test.Exists;
bool NewExists = FI_New.Exists;
// use File.Exists
bool OldExists2 = File.Exists(FileName);
bool NewExists2 = File.Exists(NewFileName);
return;//debug breakpoint
}
Run Code Online (Sandbox Code Playgroud)
有没有办法访问flush文件系统或update …
查找ListView列的名称的最佳方法是什么?
我使用我在此论坛上找到的程序将DataTable转换为List,但我无法将Id列放在第一位,特别是因为并非我的所有DataTable都有一列"Id".
我可以在集合listView.Columns.ToString()中搜索,但我看到的格式是:
"ColumnHeader:Text:Id"
我必须解析,找到正确的名称"Id".这看起来不像C#的精神.
我也尝试过:listView.SelectedItems[0].SubItems["Id"]
但是没有编译.
好的这是完整的代码.确切的问题是用户使用Courier Names和Ids在listView中选择一行,但它也可以是Ids和Names.找到所选快递的ID的最快方法是:
ListViewItem si = listCouriers.SelectedItems[0];
CourierId = si.SubItems["Id"].Text;
Run Code Online (Sandbox Code Playgroud)
但这不起作用.硬编码的方式就是这样,但我不能保证有一天会使用错误的列:
ListViewItem si = listCouriers.SelectedItems[0];
CourierId = si.SubItems[1].Text;
Run Code Online (Sandbox Code Playgroud)
使用@HuorSwords方法导致这个不那么简单的解决方案,这对我有用,但取决于合理的假设,即列中的列顺序ColumnHeaderCollection对应于表单上的显示:
ListViewItem si = listCouriers.SelectedItems[0];
string CourierId = null;
int icol = 0;
foreach (ColumnHeader header in listCouriers.Columns)
{
if (header.Text == "Id")
{
CourierId = si.SubItems[icol].Text;
break;
}
icol++;
}
Run Code Online (Sandbox Code Playgroud) (注意:原始问题标题是:从带有文档规范的字符串加载XML的最佳方法是什么?)
我需要从XmlDocument对象中的ODT opendocument(LibreOffice)文件中获取XML内容.ODT是一个zip存档,我设法将content.xml部分作为字节数组.转换为字符串似乎很简单,但我很惊讶地发现XmlDocument.LoadXml(string)不接受以Xml文档规范行开头的字符串,如:
<?xml version="1.0" encoding="UTF-8"?>
<Offices id="0" enabled="false">
<office />
</Offices>
Run Code Online (Sandbox Code Playgroud)
例外是: Data at the root level is invalid. Line 1, position 1
我想知道是否有一个库调用来读取这样的字符串?
现在我使用我即兴创作的这个功能,但是在处理xml文档时必须在角色级别上做一些事情是不必要的复杂:
/// <summary>
/// Convert an Xml document in a string, including document specification line(s),
/// to an XmlDocument object
/// </summary>
/// <param name="XmlString"></param>
/// <returns></returns>
public static XmlDocument LoadXmlString(string XmlString)
{
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.LoadXml(XmlString.Substring(XmlString.LastIndexOf("?>") + 2));
return XmlDoc;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
注意:我之前提到过这个问题
但这解决了解析字符串的问题,使用将字符串转换为字节数组的解决方案,而我不应该解析字符串,而不是将字节数组转换为字符串开头,但只是跳过此步骤直接解压缩ODT后解析字节数组.
我在 Raspberry Pi 2 上安装 uv4l raspicam 时遇到问题。我已按照http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=中的说明多次完成所有操作14、上网查了一遍又一遍,却没有解决办法。
对我来说,保存密钥的第一条指令似乎没问题,尽管我不知道如何验证它。如果我检查 apt-key 列表,我不知道应该有什么..?
当我将该行添加到sources.list并尝试执行apt-get更新后,它说:
无法获取http://www.linux-projects.org/listing/uv4l_repo/raspbian/dists/jessie/main/binary-armhf/Packages 404 Not Found
我尝试将 wheezy 和 jessie 结尾都添加到sources.list中,甚至更新了我的raspbian版本,因为我无法让它工作,但它没有帮助。
无法获取http://www.linux-projects.org/listing/uv4l_repo/raspbian/dists/wheezy/main/binary-armhf/Packages 404 未找到
在尝试更新后,进一步尝试都是徒劳的,因为安装命令也失败了:
E: 无法找到 uv4l 包
E: 无法找到包 uv4l-raspicam
我缺少什么想法吗?
谢谢!
是否有一种更智能的方法来保护foreach循环免受NullReference异常的影响:
if (G_Locatie.OverdrachtFormulierList != null)
{
foreach (OverdrachtFormulier otherform in G_Locatie.OverdrachtFormulierList)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了很多foreach循环,经常嵌套,以及很多变量,例如G_Location肯定存在,但是datamember .OverdrachtFormulierList可能还没有被分配列表使用new.
亲爱的朋友们,感谢你们的所有评论.在了解了你的建议之后,虽然很难理解,但在深入了解Lasagna代码后,我开始研究,经过一些实验,我发现最简单最干净的方法是简单地避免使用NULL,正确初始化.虽然我有点不得不在我的代码中初始化OverdrachtFormulierList,但有遗忘一个实例的风险,我找到了适当的初始化位置,即在原始类定义中.
为简单起见,请查看以下代码:
class MyClass
{
public List<string> items = new List<string>();
public IEnumerator<string> GetEnumerator()
{
return items.GetEnumerator();
}
}
class MyComplexClass
{
private MyClass _itemlist /*= new MyClass()*/;
public MyClass itemlist
{
get { return _itemlist; }
set { _itemlist = value; }
}
}
void Sandbox()
{
MyClass mc /*= new MyClass()*/;
foreach (string Sb in mc.items)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试将字符串格式应用于来自资源文件的字符串。
<p class="note">@((MarkupString)(String.Format(Localizer["Test"], 2)))</p>
Run Code Online (Sandbox Code Playgroud)
但这是它在浏览器中的显示方式:
You have done <span class="text-primary text-bold"> 2 </span> tests.
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能让它采取正确的造型?
我已经尝试过这个解决方案,但它说:
The type or namespace name 'HtmlSanitizer' could not be found
Run Code Online (Sandbox Code Playgroud)
我正在使用 Blazor 服务器和 .NET6
编辑:我有一个名为 App.resx 的文件
<data name="Test" xml:space="preserve">
<value>
You have done
&lt;span class="text-primary text-bold"&gt;
{0}
&lt;/span&gt;
tests.
</value>
</data>
Run Code Online (Sandbox Code Playgroud) c# ×9
.net-6.0 ×1
async-await ×1
blazor ×1
collections ×1
css ×1
csv ×1
debugging ×1
designer ×1
excel ×1
file ×1
foreach ×1
ienumerable ×1
iis ×1
linq ×1
listbox ×1
listview ×1
nuget ×1
null ×1
odt ×1
raspberry-pi ×1
raspbian ×1
scrollview ×1
task ×1
wpf ×1
xml ×1
xmldocument ×1