避免在winforms中更新listview时取消选择

时间:2017-02-28 09:57:40

标签: c# mysql winforms listview

我有一个listView,可以从MySql服务器中提取信息。

我目前正在使用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);
}

1 个答案:

答案 0 :(得分:1)

由于您在数据中标识了IDs,因此可以在清算之前存储所选的IDs

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

要使Find生效,最好设置Name的{​​{1}}属性来保存ListViewItem

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()更新期间尝试减少闪烁; YMMV ..