Winforms 搜索按钮丢失数据
下午, 我有一个搜索按钮,它可以按ID号、用户名或部门搜索用户列表 我有两个用户点击的列表视图,它将选中的用户加载到第二个列表视图。现在的问题是,在您单击listview1中的用户后,您转到键入ID、用户名或选择部门,然后单击搜索…它将清除您选择的所有用户,并将新用户带到您搜索的位置 我希望能够选择用户,并且能够在不丢失列表视图中当前选定用户的情况下进行搜索 我的代码Winforms 搜索按钮丢失数据,winforms,listview,c#-4.0,search,Winforms,Listview,C# 4.0,Search,下午, 我有一个搜索按钮,它可以按ID号、用户名或部门搜索用户列表 我有两个用户点击的列表视图,它将选中的用户加载到第二个列表视图。现在的问题是,在您单击listview1中的用户后,您转到键入ID、用户名或选择部门,然后单击搜索…它将清除您选择的所有用户,并将新用户带到您搜索的位置 我希望能够选择用户,并且能够在不丢失列表视图中当前选定用户的情况下进行搜索 我的代码 //search button private void Searchbutton_Click(object sen
//search button
private void Searchbutton_Click(object sender, EventArgs e)
{
try
{
listView1.Items.Clear();
string sID = string.IsNullOrEmpty(txtUserID.Text) ? null : txtUserID.Text;
string sDepartment;
if (cboDepartment.SelectedItem != null)
{
sDepartment = cboDepartment.SelectedItem.ToString();
}
else
{
sDepartment = "";
}
oConnection = new SqlConnection(_connectionString);
oCommand = new SqlCommand(@"Select us.sFieldValue5, u.sUserName, d.sName, TB_USER_CUSTOMINFO.sFieldValue2
From TB_USER u(nolock)
left join [TB_USER_CUSTOMINFO] us(nolock) on us.nUserIdn = u.nUserIdn
left join TB_USER_CUSTOMINFO on u.nUserIdn = TB_USER_CUSTOMINFO.nUserIdn
left join TB_USER_DEPT d(nolock) on d.nDepartmentIdn = u.nDepartmentIdn
where u.sUserName like '%'+ISNULL(@UserName,u.sUserName)+'%'
and us.sFieldValue5 = isnull(@IDNumber,us.sFieldValue5)
and d.sDepartment like '%'+isnull(@Department,d.sDepartment)+'%'", oConnection);
oCommand.Parameters.AddWithValue("UserName", string.IsNullOrEmpty(txtUsername.Text) ? DBNull.Value : (object)txtUsername.Text);
oCommand.Parameters.AddWithValue("IDNumber", string.IsNullOrEmpty(txtUserID.Text) ? DBNull.Value : (object)txtUserID.Text);
oCommand.Parameters.AddWithValue("Department", string.IsNullOrEmpty(sDepartment) ? DBNull.Value : (object)sDepartment);
oConnection.Open();
oDataset = new System.Data.DataSet();
SqlDataReader oReader = oCommand.ExecuteReader();
while (oReader.Read())
{
ListViewItem item1 = new ListViewItem(oReader[1].ToString());
item1.SubItems.Add(oReader[2].ToString());
item1.SubItems.Add(oReader[3].ToString());
item1.SubItems.Add(oReader[0].ToString());
listView1.Items.AddRange(new ListViewItem[] {item1});
}
oReader.Close();
oConnection.Close();
}
//selected users
private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if (e.Item.Checked == true)
{
ListViewItem l = listView1.Items[e.Item.Index];
int i = l.SubItems.Count;
string sValue1 = l.SubItems[1].Text;
string sValue2 = l.SubItems[2].Text;
string sValue3 = l.SubItems[3].Text;
ListViewItem item1 = new ListViewItem(l.SubItems[0].Text.ToString());
item1.SubItems.Add(sValue3);
item1.SubItems.Add(sValue2);
item1.SubItems.Add(sValue1);
listView2.Items.AddRange(new ListViewItem[] { (ListViewItem)l.Clone() });
}
else if (e.Item.Checked == false)
{
ListViewItem l = listView1.Items[e.Item.Index];
foreach (ListViewItem i in listView2.Items)
{
if (i.SubItems[0].Text == l.SubItems[0].Text.ToString())
{
listView2.Items.Remove(i);
}
}
}
}
ListView
记住选中了哪些ListView项目。只要你说Items.Clear()
,所有的知识都会丢失
要解决您的问题,您需要记住哪些用户已被选中,进行刷新,然后再次检查并将每个用户标记为已选中
要执行这些步骤,您确实需要将模型与视图分开。创建一个用户
模型对象来保存实际数据,然后用模型中的数据填充列表视图
。当用户执行另一次搜索时,更新或刷新模型对象,然后重新生成视图
实现这种模型/视图分离需要做更多的前期工作,但未来几代维护程序员会祝福您的名字
顺便说一句,——一个围绕.NET ListView的开源包装器——使得从模型对象列表创建一个功能齐全的ListView变得非常简单。除了删除这一行之外:listView1.Items.Clear()代码>?我不明白你的目标吗?或者您是否试图在搜索后仍选中所有选定用户?是,我希望在搜索后仍选中所有选定用户