【问题标题】:Get value from programmatically created TextBox in C#从 C# 中以编程方式创建的 TextBox 获取值
【发布时间】:2011-06-15 12:14:53
【问题描述】:

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

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

但是没有……

感谢任何提示! 谢谢

【问题讨论】:

  • 您是否收到NullReferenceException 或其他异常?

标签: c# sharepoint web-parts


【解决方案1】:

问题在于您的控件没有填充来自 CreateChildControls 中 ViewState 的值。我建议在您的按钮上使用单击事件处理程序。

更新您的按钮代码:

Button queryButton = new Button();
queryButton.UseSubmitBehavior = false;
queryButton.ID = "querybutton";
queryButton.Text = "Query";
queryButton.Click += new EventHandler(queryButton_Click);
Controls.Add(queryButton);

然后,编写点击事件处理程序:

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
}

【讨论】:

    【解决方案2】:

    尝试逐步查看Request.Form["name"] 对象。

    可能发生的情况是您的文本框可能未在视图状态下正确保存,但如果在回发时它是有效的表单对象,则它应该存在于 Request.Form 对象中,ID 可能不同所以你可能需要做一些搜索。

    【讨论】:

      【解决方案3】:

      特技,

      我找到了this,这可能会对你有所帮助。

      尝试在加载事件中查找文本框(在检查它的回发之后!)而不是 CreateChildControls,它会将您的代码分开并使事情更清晰。正如 Mmerrell 所说,id 也可能会被更改,具体取决于页面的其余部分。

      【讨论】:

        【解决方案4】:

        你得到空引用异常是因为你做了一个

        TextBox querybox = (TextBox)FindControl("querybox");
        

        在 PAGE 对象上。 所以你正在搜索 page->querybox

        但文本框在 page->form1->querybox 中。

        需要写一个递归的findcontrol,因为querybox是form1控件中的控件,而不是page中的控件。

        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;
        }
        

        【讨论】:

        • 这看起来很有用。我认为这意味着我必须将 queryBox 放在我目前没有的控件容器中,否则我将如何调用它?文本框查询 = FindControlRecursive(this, "querybox");并没有真正做到这一点。
        • 好吧,如果你还没有将文本框控件添加到父级,它肯定不会找到它。
        • 或者您可以只使用this.FindControl("querybox");(在这种情况下,this = 您的 Web 部件)。
        【解决方案5】:

        将代码包装在 !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
        

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

        您的数据库将崩溃并烧毁

        【讨论】:

        • 谢谢,试试这个!该数据库实际上是由 Camelot ADO 连接器读取的 SharePoint 列表,所以我们希望它不会出现问题! :)
        • -1... 我不认为这是正确的。每次都需要在 CreateChildControls 中创建控件,以便使用回发中的值填充。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多