【问题标题】:ListView item selection and exception handlingListView 项目选择和异常处理
【发布时间】: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,但我认为这也不是一个属性解决方案..为什么?因为用户也无法通过单击真正的空白空间来选择行。因此,那里的双击也不应该不起作用!
  • 哦,对不起,我总是忘记这一点。我正在使用列表查看模式。

标签: c# winforms listview


【解决方案1】:

由于您的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,无论是否为空,右侧或底部的背景空间都不是真正的空......!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多