gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:59:30 35 4
gpt4 key购买 nike

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

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

最佳答案

由于您的数据中有识别 ID,因此需要在清除之前存储选定的 ID:

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

要使 Find 正常工作,最好设置 ListViewItemName 属性来保存这些 ID:

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..

关于c# - 避免在 winforms 中更新 listview 时取消选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42505503/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com