从C#中以编程方式创建TextBox获取值

时间:2011-01-25 21:39:51

标签: c# sharepoint web-parts

我遇到了这个痒的问题,我无法让代码工作

如何在发布表单时从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;

但没有......

任何提示表示赞赏! 感谢

5 个答案:

答案 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

哦,不要相信用户在您的数据库上输入查询。

您的数据库将崩溃并刻录