我有一个项目列表视图,用户一次只能选择一个项目。我有以下代码,只有当我把它放在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)
,但它仍然没有用。这里有什么解决方案?
答案 0 :(得分:3)
由于ListView
处于View=List
选择状态,因此需要点击项目文字。
这很不方便我不得不承认并且FullRowSelect
没有帮助,因为它只适用于View=Details
。
这是一个快速修复:
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
var hit = listView1.HitTest(e.Location);
if (hit.Item != null)
{
string file = hit.Item.Text;
string[] arr1 = null;
if (File.Exists(file)) arr1 = File.ReadLines(file).ToArray();
...
}
}
您可能希望转到问题的底部并将代码添加到MouseUp
事件中,以选择行..:
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
var hit = listView1.HitTest(e.Location);
if (hit.Item != null) hit.Item.Selected = true;
}
请注意,HitTest
只能抓住Items
,空白与否,而不是正确或底部的空间背景空间..!