簡體   English   中英

從C#中以編程方式創建的TextBox中獲取價值

[英]Get value from programmatically created TextBox in C#

我遇到了這個瘙癢的問題,我無法使代碼正常工作

發布表單時如何從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;

但不是...

任何提示表示贊賞! 謝謝

問題是您的控件沒有填充CreateChildControls中ViewState中的值。 建議您在按鈕上使用click事件處理程序。

更新您的按鈕代碼:

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
}

嘗試逐步瀏覽並查看Request.Form["name"]對象。

可能發生的情況是您的“文本”框可能沒有在視圖狀態下正確保存,但是如果在回發時它是有效的表單對象,則它應該存在於Request.Form對象中,因此ID可能會有所不同,因此您可能必須做一些搜索。

Trikks,

我發現可能對您有幫助。

嘗試在load事件中查找文本框(檢查其回發后!),而不要查找CreateChildControls,后者將您的代碼分離開來並使事情變得更清晰。 正如Mmerrell所說,id可能也會更改,具體取決於頁面的其余部分。

您會得到null引用異常,因為您執行了

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

將代碼包裝在!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

哦,不要相信用戶在您的數據庫上輸入查詢。

您的數據庫將崩潰並刻錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM