ASP.NET CheckBoxes在后面的代码中启用/禁用Textbox

时间:2014-09-02 19:48:35

标签: c# asp.net checkbox textbox code-behind

在我的标记(Default.aspx)中,我有一个简单的表:

<asp:Table id="myAspTable" runat="server" />

我的代码背后(Default.aspx.cs),我有一个整数(n),可以是1到100之间的任何东西:

int n = getValueOfN();

根据这个数字,我可以动态创建复选框和文本框,并将它们添加到我的页面中:

CheckBox[] checks = new CheckBox[n];
TextBox[] texts = new TextBox[n];

for (int i=0; i<n; i++)
{
    checks[i] = new CheckBox();
    texts[i] = new TextBox();

    tblrow = new TableRow();
    tblcell = new TableCell();
    tblcell.Controls.Add(checks[i]);
    tblcell.Controls.Add(texts[i]);
    tblrow.Controls.Add(tblcell);
    myAspTable.Controls.Add(tblrow);
}

我现在想要添加以下功能:每个复选框我必须分别在选中/取消选中时启用或禁用文本框i。如何在代码隐藏中100%执行此操作?

以下是我的尝试:

checks[i].AutoPostBack = true;
checks[i].CheckedChanged += new EventHandler(this.CheckToggleEnable);


public void CheckToggleEnable(object sender, EventArgs e)
{
    // Implementation here
}

但这不起作用,因为我无法在CheckToggleEnable函数中引用Textbox i。另外,我希望没有回复就能做到这一点。

2 个答案:

答案 0 :(得分:2)

在ASP.Net中,如果您创建一个控件动态,则需要在将其发回服务器时重新创建它。

基本上,n代码中不应该是动态的。否则,我们不知道在回发中需要重新创建多少控件。

选中 CheckBox 后,以下代码将检索兄弟 TextBox

<asp:Table ID="myAspTable" runat="server" />

protected void Page_Load(object sender, EventArgs e)
{
    int n = 3;

    for (int i = 0; i < n; i++)
    {
        var checkBox = new CheckBox();
        var textBox = new TextBox();

        var tblrow = new TableRow();
        var tblcell = new TableCell();
        tblcell.Controls.Add(checkBox);
        tblcell.Controls.Add(textBox);
        tblrow.Controls.Add(tblcell);
        myAspTable.Controls.Add(tblrow);

        checkBox.AutoPostBack = true;
        checkBox.CheckedChanged += CheckBox_CheckedChanged;
    }
}

protected void CheckBox_CheckedChanged(object sender, EventArgs e)
{
    var checkbox = sender as CheckBox;

    var textbox = checkbox.Parent.Controls.OfType<TextBox>()
        .Select(control => control)
        .FirstOrDefault();

    if (textbox != null)
    {
        string value = textbox.Text;
    }
}

答案 1 :(得分:1)

在每个复选框上:

AutoPostBack="True"

每次点击一个帖子都会回复到服务器。您可以附加到CheckChanged事件,然后找到正确的文本框并设置:

Enabled="True"
Enabled="False"

视情况而定。

我建议,如果你有很多检查,要在客户端JavaScript中执行此操作,因为重复发送回服务器的性能......它可能在服务器上密集。