ListView项目选择和异常处理

时间:2017-05-30 13:37:07

标签: c# winforms listview

我有一个项目列表视图,用户一次只能选择一个项目。我有以下代码,只有当我把它放在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),但它仍然没有用。这里有什么解决方案?

1 个答案:

答案 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,空白与否,而不是正确或底部的空间背景空间..!