我正在用asp.net构建一个页面。我有一个表格,其中包含TextBoxes和一个提交按钮。提交表单时,我想获取输入到TextBox中的所有文本并对其进行操作。为此,我有以下方法:
protected void Button1_Click(object sender, EventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (Control c in this.Controls)
{
if (c.GetType().Name == "TextBox")
{
TextBox tb = (TextBox)c;
sb.AppendLine(tb.Text);
}
}
Label1.Text = sb.ToString();
}
问题在于控件显然不包含任何文本框。当我遍历控件并打印出他们的名字时,我得到的唯一一个是“site_master”。 (我也尝试过Controls和Page.Controls而不是this.Controls。)
我的迭代器有问题吗?有没有其他方法可以迭代表或页面中的所有文本框?实现这一目标的最佳方法是什么?
答案 0 :(得分:4)
如果您知道所有文本框控件,那么构建List<Textbox>
会不会太多?
List<Textbox> txtBoxes = new List<Textbox>();
txtBoxes.Add(tb1);
txtBoxes.Add(tb2);
//etc..
然后你有一个很好的列表可以使用
答案 1 :(得分:1)
如果我知道控件都在给定的包含控件中,我只需轮询 控件的控件。例如,this.Form.Controls
。但是,如果它们可以嵌套在其他子控件中,那么您可以递归地从公共外部容器中探索深度。
private IEnumerable<T> FindControls<T>(Control parent) where T : Control
{
foreach (Control control in parent.Controls)
{
if (control is T)
yield return (T)control;
foreach (T item in FindControls<T>(control))
yield return item;
}
}
因此,这将允许您检索所有TextBox
个孩子。
List<TextBox> textBoxes = this.FindControls<TextBox>(this).ToList();
string output = string.Join(",", textBoxes.Select(tb => tb.Text));
答案 2 :(得分:0)
我将假设您使用的是Web表单ASP.NET。通常,您使用类似于
的内容在aspx页面上声明控件<asp:TextBox ID="someId" runat="server/>
如果您已完成此操作,那么在您的代码中,您应该只能引用变量someId
和属性Text
来获取/设置控件中的文本。
如果要在服务器上动态构建控件,则应该能够将它们粘贴到列表中并迭代它。确保在page lifecycle的正确部分中创建控件并将其添加到表中。当您将它们添加到表格中的单元格时,您还可以在列表中保留对控件的引用,并在事件处理程序中枚举该列表。
也许有些事情(我没有编译,所以可能存在问题):
public class MyPage: Page
{
private List<TextBox> TxtBoxes = new List<TextBox>();
//registered for the preinit on the page....
public void PreInitHandler(object sender, EventArgs e)
{
for(var i = 0; i < 2; i++)
{
var txtBox = new TextBox{Id = textBox+i};
//...add cell to table and add txtBox Control
TxtBoxes.Add(txtBox);
}
}
}