2014-12-04 132 views
0

下午,搜索按钮丢失datada

我有一个搜索按钮,搜索用户列表是由ID号码,用户名或部门。

我有2个列表视图,用户点击并将选定的用户加载到第二个列表视图。现在问题出在你从listview1中点击用户后,你转到输入ID,用户名或选择部门,然后单击搜索...它将清除你选择的所有用户,并将新用户u带到搜索位置。

我希望能够选择用户能够在不从列表视图

我的代码失去了我的当前选择的用户搜索;

//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); 
       } 
      } 
     } 
    }                      
+0

除了删除这行:'listView1.Items.Clear();'?我不理解你的目标吗?或者您是否试图在搜索后仍然检查所有选定的用户? – JWiley 2014-12-04 14:08:10

+0

是的,我想保留所有选定的用户在您的搜索后仍然检查 – 2014-12-05 06:27:40

回答

0

ListView记得检查了哪个ListViewItems。只要你说Items.Clear(),所有的知识都会丢失。

要解决您的问题,您需要记住检查了哪些用户,进行刷新,然后再次将每个用户标记为已选中状态。

要执行这些步骤,你真的需要你的模型从您的视图中分离出来。创建一个User模型对象来保存实际数据,然后用您的模型中的数据填充您的ListView。当用户进行其他搜索,更新或刷新模型对象时,然后重新构建您的视图。

做这种模型/视图分离是多一点工作,但未来的维护程序员会保佑你的名字。

顺便说一句,ObjectListView - 围绕.NET ListView的开源代码包装 - 使得从模型对象列表创建功能齐全的ListView非常简单。