2012-01-09 67 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;

相关问题