2012-01-09 73 views
0

我在C#中有很多複選框和名字的數據。當單擊一個按鈕時,首先,表中的所有數據都將被刪除,並且對於每個選中的複選框,該ID都會再次插入tabel中。這很好。checkbox.Visible = false;但它在那裏?

問題是,當我只顯示某些複選框,例如firstname是John。顯示所有帶有ID的複選框,但只有包含John的複選框纔可見。如果我再檢查幾個複選框,然後單擊按鈕,所有的所有行都會被刪除,然後我的想法是複選框可見= false;斯蒂爾在那裏,並再次插入。但他們不是...

是否有另一種方式來做到這一點,所以它像我想要的那樣工作?

protected void Page_Load(object sender, EventArgs e) 
{ 
    GetEmployee(); 
    CompareEmployee(); 
} 

private void GetEmployee() 
{ 

string FirstName = table.Rows[i]["FirstName"].ToString(); 
string qs = (Request.QueryString["search"].ToString()); 


DataTable table = SearchPerson(search); 
for (int i = 0; i < table.Rows.Count; i++) 
    { 

     CheckBox checkbox = new CheckBox(); 
     checkbox.ID = table.Rows[i]["UserID"].ToString(); 
     checkbox.Visible = false; 

     HyperLink hlFirstName = new HyperLink(); 
     hlFirstName.Text = table.Rows[i]["FirstName"].ToString();    
     hlFirstName.Visible = false; 


     string FirstName = table.Rows[i]["FirstName"].ToString();    
     string qs = (Request.QueryString["search"].ToString()); 

     if (qs.Contains(FirstName)) 
     { 
      checkbox.Visible = true; 
      hlFirstName.Visible = true;     
     } 

     phEmployee.Controls.Add(checkbox); 
     phEmployee.Controls.Add(hlFirstName); 

    } 
} 

private void CompareEmployee() 
{ 
    int UserID = ((User)Session["LoggedInUser"]).UserID; 
    DataTable table = new DataTable(); 
    table = GetEmployee(UserID); 

    foreach (Control c in phEmployee.Controls) 
    { 
     if (c.GetType() == typeof(CheckBox)) 
     { 
      for (int i = 0; i < table.Rows.Count; i++) 
      { 
       if (c.ID == table.Rows[i][0].ToString()) 
       { 
        (c as CheckBox).Checked = true; 
       } 
      } 
     } 
    } 
} 

protected void btnUpdate_Click(object sender, EventArgs e) 
{ 
    int UserID = ((User)Session["LoggedInUser"]).UserID; 
    {    
     DeleteEmployee(UserID); 

     foreach (Control c in phEmployee.Controls) 
     { 
      if (c.GetType() == typeof(CheckBox)) 
      { 
       if ((c as CheckBox).Checked) 
       { 
        AddEmployee(c.ID, UserID); 
       } 
      } 
     } 
     Response.Redirect("Default.aspx"); 
    } 
} 
+0

檢查CheckBox的'view state' – 2012-01-09 18:17:23

回答

3

設置Visiblefalse不會導致複選框消失到某個無效,它仍然存在於您的Controls集合中。我會避免以這種方式使用UI的狀態,而是處理事件CheckedChanged並設置一些內部數據結構以告訴您當前狀態。

此外,避免執行兩個強制轉換。你可以簡單地做

var chk = c as CheckBox; 
if(c != null) 
{ 
    AddEmployee(c.ID, UserID); 
} 
3

複選框仍然存在。但他們不一定要檢查。從您的描述中,它聽起來像是無形的未經檢查的框正在導致記錄被刪除。

+0

是的,即使複選框的Visible屬性設置爲False,它在每次頁面加載時仍然存在於控件樹中,其Checked屬性將爲False。但我認爲我們錯過了OP的一些東西。也許他可以發佈代碼和標記的簡化版本來演示這個問題。 – 2012-01-09 18:15:49

+0

重要的是,如果複選框被選中或者數據庫中的所有ID都被刪除,那麼選中的複選框就會被插入。但不插入invisibel checboxes。 – user1007103 2012-01-09 18:19:27

+0

@ user1007103:您剛纔說「那麼,選中的複選框已插入」。很明顯,複選框是否被選中無關緊要。使用一些基本的調試技巧,例如統計複選框的數量,檢查複選框的數量以及在通過循環的過程中不可見覆選框的數量。然後在循環之後,使用'Debug.WriteLine'來顯示這些總數。 – 2012-01-09 18:39:55

1

您的if()後面有一個;,基本上關閉了該語句:if (qs.Contains(FirstName));總是執行以下括號。您可能會遺漏代碼來隱藏複選框,但這不在您的代碼中。

+0

複選框和名字是Visibel = false;作爲默認值。 – user1007103 2012-01-09 18:14:55

+0

馬里奧試圖說的是,如果(qs.Contains(FirstName)); 不會做任何事情,因爲它是一個EMPTY if語句,因爲分號緊接在條件之後。 – Mzn 2012-01-09 18:18:16

+0

是的,現在,只需刪除該分號並測試它是否按預期工作即可。 – Mario 2012-01-09 18:20:34

0

在C#中我用這個,它的工作。希望能幫助到你!

_checkBoxName.Visibility = System.Windows.Visibility.Visible;

相關問題