2017-05-30 77 views
1

我有一个项目列表视图,其中用户一次只能选择一个。我有下面的代码,只有当我把它放在try/catch块中才能正常工作。问题是,某些项目名称太长,并且会为其他项目产生大量空白区域。点击空格将导致ArgumentOutOfRangeException,即使它与某个项目位于同一行。我通过将它放在try/catch块中解决了这个问题,但我认为这是一种肮脏的方法,即使它可行。以下是代码。ListView项目选择和异常处理

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),但它仍然不起作用。这里有什么解决方案?

+1

当您应该测试listView1.SelectedItems.Count时不要使用try!这是一个正常的情况。也不要把这么多的命令堆成一行;难以调试,并在添加检查的方式.. – TaW

+0

底层的问题是,虽然,我想使用户总是选择该项目所在的行,无论他点击,名称或空白处。 – EInherjar

+0

是的,的确如此,但我的建议仍然适用!你使用哪种视图模式? – TaW

回答

3

由于您的ListViewView=List选择使得它有必要击中项目文本。

这是不方便的,我不得不承认,FullRowSelect turnnig没有帮助,因为它只是为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,空或不,真正emtpy背景空间的权利或底部..!