在我的标记(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。另外,我希望没有回复就能做到这一点。
答案 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中执行此操作,因为重复发送回服务器的性能......它可能在服务器上密集。