Winforms 搜索按钮丢失数据

Winforms 搜索按钮丢失数据,winforms,listview,c#-4.0,search,Winforms,Listview,C# 4.0,Search,下午, 我有一个搜索按钮,它可以按ID号、用户名或部门搜索用户列表 我有两个用户点击的列表视图,它将选中的用户加载到第二个列表视图。现在的问题是,在您单击listview1中的用户后,您转到键入ID、用户名或选择部门,然后单击搜索…它将清除您选择的所有用户,并将新用户带到您搜索的位置 我希望能够选择用户,并且能够在不丢失列表视图中当前选定用户的情况下进行搜索 我的代码 //search button private void Searchbutton_Click(object sen

下午,

我有一个搜索按钮,它可以按ID号、用户名或部门搜索用户列表

我有两个用户点击的列表视图,它将选中的用户加载到第二个列表视图。现在的问题是,在您单击listview1中的用户后,您转到键入ID、用户名或选择部门,然后单击搜索…它将清除您选择的所有用户,并将新用户带到您搜索的位置

我希望能够选择用户,并且能够在不丢失列表视图中当前选定用户的情况下进行搜索

我的代码

   //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()?我不明白你的目标吗?或者您是否试图在搜索后仍选中所有选定用户?是,我希望在搜索后仍选中所有选定用户