【问题标题】:avoid deselection upon updating listview in winforms在 winforms 中更新列表视图时避免取消选择
【发布时间】:2017-02-28 09:57:39
【问题描述】:

我有一个从 MySql 服务器提取信息的 listView。

我目前使用timer 每 5 秒左右更新一次此信息。但是每次出现updateListView 时,我的选择都会失去焦点。我将如何防止这种情况?我在 stackoverflow 上环顾四周,但找不到适合我的解决方案。

这是我正在使用的函数updateListView(从 mySql 获取数据):

MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM " + selectTable.Text, dbCon.Connection);
try
{
     listView1.Items.Clear(); // suspecting that problem lies here,
                             //  any other way to do this?
     using (MySqlDataReader reader2 = cmd2.ExecuteReader())
     {
         while (reader2.Read())
         {
              ListViewItem item = new ListViewItem(reader2["ID"].ToString());
              item.SubItems.Add(reader2["Name"].ToString());
              item.SubItems.Add(reader2["Age"].ToString());
              item.SubItems.Add(reader2["DiveNr"].ToString());
              item.SubItems.Add(reader2["Difficulty"].ToString());
              item.SubItems.Add(reader2["Points"].ToString());

              listView1.Items.Add(item);
         }
     }
}
catch (Exception ex)
{
     MessageBox.Show("Error updateListView:" + ex.Message);
}

【问题讨论】:

  • 嗯,'取消选择'!='选择失去焦点'!它是哪一个? - 您可能必须存储旧选择并在刷新后恢复它。这可能像存储索引一样简单,也可能像实现自定义查找功能一样复杂,具体取决于您的数据..
  • @TaW 我最初解决这个问题的计划是创建一个函数,在更新发生之前存储“我当前选择的索引”,但这似乎不能实现这一点。更像是一个丑陋的解决方法。如果有人知道如何创建更复杂的解决方案,请在此处查看。
  • 正如我所写:它真的依赖于您的数据!通常这些指数是不够的,但有时它们会:如果你的项目是一年中​​的月份和销售额的总和,它们就足够了。但是,如果项目的数量和/或顺序不稳定,您需要一些识别属性。可以是字符串或 guid 或其他什么。你将不得不决定..
  • 在您的问题中,您怀疑是否应该清除这些项目。那么这又取决于:这些项目是稳定的,只有少数值会改变,还是可以添加或删除项目?
  • 那就不用担心了,只专注于识别物品。看起来IDs 可以吗?所以存储选择的ID(来自LV.SelectedItems并在重新加载后重新选择这些......!

标签: c# mysql winforms listview


【解决方案1】:

由于您在数据中识别了IDs,因此在清除之前存储选定的IDs

var sel = listView1.SelectedItems.Cast<ListViewItem>().Select(x => x.Name).ToList();

为了使Find 工作,最好将ListViewItemName 属性设置为保存IDs

ListViewItem item = new ListViewItem(reader2["ID"].ToString());
item.Name = item.Text;

加载新数据后,您可以尝试重新选择每个数据:

foreach (var lvi in sel)
{
    var found = listView1.Items.Find(lvi, false);
    if (found.Length > 0) found[0].Selected = true;
}

SuspendLayout()ResumeLayout() 在更新期间可能会或可能不想尝试减少闪烁; ymmv..

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多