2014-12-04 76 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非常簡單。