【问题标题】:enable dynamic textbox for checking dynamic checkbox in c#在 C# 中启用动态文本框以检查动态复选框
【发布时间】:2015-04-24 17:16:15
【问题描述】:

我在这里创建一个文本框及其对应的复选框。我需要的是...当我选中复选框时,我想启用文本框 注意:文本框最初是禁用的

    for (int i = 0; i < count; i++)
    {
        TableRow row = new TableRow();
        for (int j = 0; j < 1; j++)
        {
            TableCell cell = new TableCell();
            CheckBox chk = new CheckBox();
            TextBox txt_ele = new TextBox();

            txt_ele.ID = "elective" + i;
            txt_ele.Enabled = false;

            chk.ID = "chk_" + i.ToString();
            chk.Text = "Has Elective Subjects";
            chk.AutoPostBack = true;

            cell.Controls.Add(chk);
            cell.Controls.Add(txt_ele);

            row.Cells.Add(cell);
            chk.CheckedChanged += new System.EventHandler (chkDynamic_CheckedChanged);
        }
        table.Rows.Add(row);
        this.NumberOfControls++;
    }

page.Form.Controls.Add(table);

复选框勾选事件如下

protected void chkDynamic_CheckedChanged (object sender, EventArgs e)
{
    CheckBox lb = (CheckBox)sender;
    if (lb.Checked)
    {
          //how to do here
    }
}

【问题讨论】:

    标签: c# asp.net dynamic controls


    【解决方案1】:

    对于动态(无回发),您需要在您的 aspx 页面或 jQuery 上使用 AJAX (UpdatePanel),至少这样更容易

    【讨论】:

    • ajax 已回发,但不会刷新整个页面。他没有说他不想回帖
    【解决方案2】:

    这是一个非常肮脏的解决方案,但您可以将其拾取并使其成为生产解决方案:

    protected void chkDynamic_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox lb = (CheckBox)sender;
        if (lb.Checked)
        {
            ((TextBox)lb.Parent.FindControl("elective" + lb.ID.Replace("chk_", string.Empty))).Enabled = true;
        }
    }
    

    【讨论】:

    • 复选框是否回传?当您点击处理程序时,它执行正常还是有任何异常?
    【解决方案3】:

    怎么样:

    protected void chkDynamic_CheckedChanged (object sender, EventArgs e)
    {
        CheckBox lb = (CheckBox)sender;
        if (lb.Checked)
        {
            (Page.FindControlRecursive(
                "elective" + System.Text.RegularExpressions.Regex.Match(
                    lb.ID, 
                    @"(\d+)(?!.*\d)").ToString()) 
                as System.Web.UI.WebControls.WebControl)
            .Enabled = true;
        }
    }
    
    public static Control FindControlRecursive(this Control Root, string Id)
    {
        if (Root.ID == Id)
        {
            return Root;
        }
    
        foreach (Control Ctl in Root.Controls)
        {
            Control FoundCtl = FindControlRecursive(Ctl, Id);
            if (FoundCtl != null)
            {
                return FoundCtl;
            }
        }
    
        return null;
    }
    

    这是匹配复选框 id 的数字部分,然后使用它来创建文本框 id。使用 FindControl 检索控件,然后启用它。

    【讨论】:

    • 在您的 chkDynamic_CheckedChanged 事件中
    • 我刚刚在正则表达式之前添加了一个@符号;试试看
    • 我添加了另一种方法来查找控件以防万一出现问题,但是看到您没有收到任何错误,似乎必须找到控件并且这可能赢了不要让你更进一步。我最终测试了上面的代码,它对我来说很好。
    • m 出现以下错误:编译器错误消息:CS1106:扩展方法必须在非泛型静态类中定义
    猜你喜欢
    • 2020-03-15
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2013-03-09
    相关资源
    最近更新 更多