我遇到了这个痒的问题,我无法让代码工作
如何在发布表单时从TextBox中读取值?
一些代码......
protected override void CreateChildControls() {
base.CreateChildControls();
TextBox queryBox = new TextBox();
queryBox.ID = "querybox";
queryBox.ToolTip = "Enter your query here and press submit";
Controls.Add(queryBox);
Button queryButton = new Button();
queryButton.UseSubmitBehavior = false;
queryButton.ID = "querybutton";
Controls.Add(queryButton);
if (Page.IsPostBack == true) {
try {
string query = querybox.Text;
DataGrid dataGrid = new DataGrid();
dataGrid.DataSource = Camelot.SharePointConnector.Data.Helper.ExecuteDataTable(query, connectionString);
dataGrid.DataBind();
Controls.Add(dataGrid);
} catch (Exception a) {
Controls.Add(new LiteralControl(a.Message));
} // try
} // if
} // void
我稍微缩短了代码,但你看到了这个想法,它的字符串query = querybox.text不起作用。我尝试过几种不同的变体,即
TextBox querybox = (TextBox)FindControl("querybox");
string query = querybox.Text;
但没有......
任何提示表示赞赏! 感谢
答案 0 :(得分:3)
问题是您的控件未使用CreateChildControls中ViewState的值填充。我建议在按钮上使用单击事件处理程序。
更新按钮代码:
Button queryButton = new Button();
queryButton.UseSubmitBehavior = false;
queryButton.ID = "querybutton";
queryButton.Text = "Query";
queryButton.Click += new EventHandler(queryButton_Click);
Controls.Add(queryButton);
然后,编写click事件处理程序:
void queryButton_Click(object sender, EventArgs e)
{
TextBox querybox = this.FindControl("querybox") as TextBox;
try
{
string query = querybox.Text;
DataGrid dataGrid = new DataGrid();
dataGrid.DataSource = Camelot.SharePointConnector.Data.Helper.ExecuteDataTable(query, connectionString);
dataGrid.DataBind();
Controls.Add(dataGrid);
}
catch (Exception a)
{
Controls.Add(new LiteralControl(a.Message));
} // try
}
答案 1 :(得分:1)
尝试单步执行并查看Request.Form["name"]
对象。
可能发生的情况是您的文本框可能无法在视图状态下正确保存,但如果回发时它是有效的表单对象,它应该存在于Request.Form对象中,ID可能不同所以你可能需要做一些搜索。
答案 2 :(得分:1)
Trikks,
我发现this可能对您有帮助。
尝试在load事件中查找文本框(在检查其回发后!)而不是CreateChildControls,它会将您的代码分开并使事情更清晰一些。正如Mmerrell所说,id也可能会被改变,具体取决于页面的其余部分。
答案 3 :(得分:1)
您获得了空引用异常,因为您执行了
TextBox querybox = (TextBox)FindControl("querybox");
PAGE对象上的。 因此,您正在搜索page-> querybox
但文本框位于page-> form1-> querybox。
你需要编写一个递归的findcontrol,因为querybox是form1控件中的一个控件,而不是页面中的控件。
public static Control FindControlRecursive(Control container, string name)
{
if ((container.ID != null) && (container.ID.Equals(name)))
return container;
foreach (Control ctrl in container.Controls)
{
Control foundCtrl = FindControlRecursive(ctrl, name);
if (foundCtrl != null)
return foundCtrl;
}
return null;
}
答案 4 :(得分:0)
将代码包装在!Page.IsPostBack检查中可能会有所帮助。否则,文本框将在回发时重新创建并删除任何信息。
if (!Page.IspostBack) {
TextBox queryBox = new TextBox();
queryBox.ID = "querybox";
queryBox.ToolTip = "Enter your query here and press submit";
Controls.Add(queryBox);
Button queryButton = new Button();
queryButton.UseSubmitBehavior = false;
queryButton.ID = "querybutton";
Controls.Add(queryButton);
} else {
try {
string query = querybox.Text;
DataGrid dataGrid = new DataGrid();
dataGrid.DataSource = Camelot.SharePointConnector.Data.Helper.ExecuteDataTable(query, connectionString);
dataGrid.DataBind();
Controls.Add(dataGrid);
} catch (Exception a) {
Controls.Add(new LiteralControl(a.Message));
} // try
} // if
哦,不要相信用户在您的数据库上输入查询。
您的数据库将崩溃并刻录