我有一个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);
}
答案 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 ..