Получить значение из программно созданного TextBox в C # - PullRequest
2 голосов
/ 26 января 2011

У меня проблема с зудом, и я не могу заставить работать код

Как я могу прочитать значение из 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 ]

3 голосов
/ 26 января 2011

Проблема в том, что ваши элементы управления не заполнены значениями из ViewState в CreateChildControls. Я бы порекомендовал использовать обработчик событий нажатия на кнопку.

Обновите код вашей кнопки:

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 голос
/ 26 января 2011

Вы получаете исключение нулевой ссылки, потому что вы делаете

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

на объекте 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;
}
1 голос
/ 26 января 2011

Попробуйте пройти и посмотреть на объект Request.Form["name"].

Вероятно, происходит то, что ваше текстовое поле может не сохраняться должным образом в состоянии просмотра, но если оно является допустимым объектом формы, когда происходит обратная запись, он должен существовать в объекте Request.Form, IDможет отличаться, поэтому вам, возможно, придется поискать.

1 голос
/ 26 января 2011

Trikks,

Я нашел это , которое может вам помочь.

Попробуйте найти текстовое поле в событии загрузки (после проверки его обратной передачи!), а не CreateChildControls, который выделит ваш код и сделает вещи более понятными.Как говорит Ммеррелл, идентификатор, вероятно, тоже будет изменен, в зависимости от остальной части страницы.

0 голосов
/ 26 января 2011

Это может помочь обернуть код в проверку! 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

О, и не доверяйте пользователю вводить запрос в вашу базу данных.

Ваша база данных вылетит и сгорит

...