【发布时间】:2017-05-30 13:37:07
【问题描述】:
我有一个项目列表视图,其中用户一次只能选择一个。我有以下代码,仅当我将其放入 try/catch 块时才能正常工作。问题是,某些项目名称太长,它们会导致其他项目出现大量空白。单击空白将导致ArgumentOutOfRangeException,即使它与项目位于同一行。我通过将它推到 try/catch 块中解决了这个问题,但我觉得这是一种肮脏的做法,即使它有效。下面是代码。
private void listView1_DoubleClick(object sender, EventArgs e)
{
try
{
string[] arr1 = File.ReadAllLines(listView1.SelectedItems[0].Tag.ToString());
string[] arr2 = arr1[0].Split(';');
}
catch
{
//no catch
}
}
我想完全避免这种情况,但我不知道如何更改代码以使其在没有 try/catch 的情况下工作。我试过if(!String.IsNullOrEmpty),但还是不行。这里的解决方案是什么?
【问题讨论】:
-
当你应该测试listView1.SelectedItems.Count时不要使用try!这是正常情况。也不要将这么多命令堆积在一行中;添加检查时难以调试和妨碍..
-
但是,潜在的问题是,我想让用户始终选择项目所在的行,而不管他单击的位置、名称或空格。
-
@EInherjar 这非常简单,但是你不能不假思索地一次性写一大堆代码,然后当它没有按照你希望的那样做时无助地盯着屏幕它可能。相反,您所做的是使用列表视图的属性来找出用户单击的内容。然后你有一些 ifs 等等来决定如何处理它。如果它引发索引超出范围异常,请修复您的代码以检查索引并仅在索引在范围内时使用它。如果您收到空引用异常,请修复您的代码,使其不会那样做。检查索引,检查空值。
-
您可以尝试开启
FullRowSelect。但是您仍然应该添加您缺少的检查。如果这对您没有帮助,您将不得不做一个HitTest,但我认为这也不是一个属性解决方案..为什么?因为用户也无法通过单击真正的空白空间来选择行。因此,那里的双击也不应该不起作用! -
哦,对不起,我总是忘记这一点。我正在使用列表查看模式。