我遇到了使用eventhandler textchanged方法处理文本框数组的问题。文本框是通过C#生成的,而不是通过ASP.NET生成的。
这是C#中的TextBox代码:
int i = 1;
foreach(string a in data)
{
i++;
TextBox text = new TextBox();
text.TextChanged += new EventHandler(updateone);
text.AutoPostBack = true;
text.ID = Convert.ToString(i);
}
我尝试了Text.AutoPostBack false和true,我得到了相同的结果。当我更改文本框的文本时,甚至没有触及updateone方法。当我更改文本时 它确实更新了网站的文本框,但在代码中甚至没有触及updateone方法。这是updateone代码:
protected void updateone(object sender, EventArgs e)
{
TextBox text = (TextBox)sender;
}
我感谢大家的帮助!我很困惑为什么这不起作用...而且我还必须使用C#方法而不是ASP.NET方式。
答案 0 :(得分:1)
您是否尝试在实例成员中存储对TextBox的引用,以便它们不会被垃圾收集?
类似的东西:
List<TextBox> textBoxes = ...
//in a loop
text.ID = Convert.ToString(i);
textBoxes.Add(text);
- 编辑
另外,根据经验,尽可能多地记录您的应用程序。
无论是NLog
,任何其他日志记录工具,还是简单的Console.WriteLine()
,查看代码实际执行的操作都非常有用。
答案 1 :(得分:0)
既然你已经确认你发布了你的实际代码并且似乎没有得到我想说的内容,那么让我试着在一个答案中解释。
第一个问题:您的TextBox
es数组不存在,其他答案已经解决,您显然已修复但未更新问题中的代码以显示您的修复。
第二个问题:您创建的TextBox
es不会以任何方式添加到您的表单中。我不确定你是如何在没有这样做的情况下测试你的事件处理程序的。
第三个问题:您的事件处理程序updateone
没有做任何事情。想象一下,你走进一家杂货店,拿起一个橘子,把它放回去,然后离开。这就是你的事件处理程序正在做的事情。不要只是实例化一个临时的TextBox
然后什么都不做,而是尝试弹出一个消息框,或者更改表单上存在的另一个控件的文本。
也许这样的事情会起作用:
List<TextBox> textboxes = new List<TextBox>();
int i=1;
foreach(string a in data) // I assume data is a list or array of strings
{
// I'm not sure why you iterate over data if you don't use it at all inside the loop...
++i;
TextBox text = new TextBox();
text.TextChanged += new EventHandler(updateone);
text.AutoPostBack = true;
text.ID = Convert.ToString(i);
// Add the TextBox to form here, not sure what the call is
}
Label info = new Label;
Label.Text = "Hello!";
// Add Label to form here, again not sure what the call is
然后你的事件处理程序:
protected void updateone(object sender, EventArgs e)
{
info.Text = ((TextBox)sender).Text;
}
答案 2 :(得分:0)
您正在动态创建ASP.NET控件。这意味着它们不会在表单的回发上自动重新创建。此外,必须在Page_Init事件中创建控件,而不是Page_Load事件。
所以问题是,你在何时何地创建文本框。确保它们是在Page_Init阶段创建的,并且您在请求和回发中创建它们。