【问题标题】:checkbox.Visible = false; but is it stil there?复选框。可见 = 假;但它还在吗?
【发布时间】:2017-08-05 01:48:15
【问题描述】:

我在 C# 中有一个 Datalist,其中包含很多复选框和名字。单击按钮时,首先,表中的所有数据都将被删除,并且对于选中的每个复选框,ID 都会再次插入表中。效果很好。

问题是当我只显示某些复选框时,例如名字是 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");
    }
}

【问题讨论】:

  • 检查复选框的view state

标签: c# asp.net


【解决方案1】:

Visible 设置为false 不会导致复选框消失在某个空白处,它仍然存在于您的Controls 集合中。我会避免以这种方式使用你的 UI 状态,而是处理 CheckedChanged 事件并设置一些内部数据结构来告诉你当前状态是什么。

另外,避免执行两次强制转换。你可以简单地做

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

【讨论】:

    【解决方案2】:

    复选框仍然存在。但不一定要检查它们。根据您的描述,听起来不可见的未选中框会导致记录被删除。

    【讨论】:

    • 是的,即使复选框的 Visible 属性设置为 False,在每次页面加载期间它仍然存在于控件树中,并且其 Checked 属性将为 False。但我认为我们在 OP 中遗漏了一些东西。也许他可以发布一个简化版本的代码和标记来演示这个问题。
    • 无论是复选框被选中还是数据库中的所有 ID:s 都没有被删除都无关紧要,然后插入选中的复选框。但未插入 invisibel 复选框。
    • @user1007103:你刚才说“然后,选中的复选框被插入”。很明显,复选框是否被选中并不重要。在循环过程中使用一些基本的调试技巧,比如计算复选框的数量、选中的复选框的数量以及不可见的复选框的数量。然后在循环之后,使用Debug.WriteLine 显示这些总数。
    【解决方案3】:

    您的if() 后面有一个;,实质上是关闭该语句:if (qs.Contains(FirstName)); 始终执行以下括号。您可能还缺少隐藏复选框的代码,但这不在您上面的代码中。

    【讨论】:

    • 复选框和名字是 Visibel = false;默认。
    • 马里奥想说的是 if (qs.Contains(FirstName));不会做任何事情,因为它是一个 EMPTY if 语句,因为分号紧跟在条件之后。
    • 是的,现在,只需删除该分号并测试它现在是否按预期工作。
    • 我尝试删除分号,现在当我输入名称时,结果区分大小写...(我不希望它区分大小写)并且结果与以前相同,invisibel未插入复选框。
    • 重读您的问题后,我认为您可能会混淆“不可见/可见”和“已选中/未选中”。你能重新检查一下这些吗?此外,还有一些不同之处:您通常不应该删除所有条目。只需删除那些应该删除的。否则,您可能会在出现错误时丢失数据(例如,崩溃或系统关闭发生的时间错误)。
    【解决方案4】:

    在 C# 中,我使用了它并且它有效。希望对您有所帮助!

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

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 2011-07-02
      • 2015-06-29
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多