Элемент управления внутри EditItemTemplate будет доступен в Page_Load (), только если - PullRequest
1 голос
/ 22 апреля 2009


На моей странице я определил элементы управления TextBox1, Label1 и GridView1. Внутри GridView1 я определил следующий шаблон:

           <asp:TemplateField>

              <ItemTemplate>
                <asp:LinkButton runat="server" Text="Edit" CommandName="Edit" ID="cmdEdit" />         
              </ItemTemplate>

              <EditItemTemplate>
                <asp:TextBox Text='<%# Bind("Notes") %>' runat="server" id="textBoxNotes" />
                <br /><br />
                <asp:LinkButton runat="server" Text="Update" 
                 CommandName="Update" ID="cmdUpdate" /> 
                <asp:LinkButton runat="server" Text="Cancel" 
                 CommandName="Cancel" ID="cmdCancel" />
              </EditItemTemplate>

            </asp:TemplateField>

Если пользователь вводит текст в textBoxNotes и нажимает кнопку cmdUpdate, то при обратной передаче этот текст будет уже доступен при вызове Page_Load ().


Таким образом, если пользователь до нажатия кнопки обновления cmdUpdate также вводил в TextBox1 строку «что-то», то следующий код извлечет текст, введенный пользователем в textBoxNotes

    protected void Page_Load(object sender, EventArgs e)
    {
        if(TextBox1.Text=="text from Notes")
        Label1.Text =((TextBox)gridEmployees.Rows[0].Cells[0].FindControl("textBoxNotes")).Text;
    }


A) Следующий код должен также извлечь текст, введенный пользователем в textBoxNotes, но как только я нажимаю кнопку cmdEdit, я получаю «Ссылка на объект не установлена ​​на экземпляр объекта».

    protected void Page_Load(object sender, EventArgs e)
    {
        if(IsPostBack)
        Label1.Text =((TextBox)gridEmployees.Rows[0].Cells[0].FindControl("textBoxNotes")).Text;
    }

Почему я получаю это исключение? Похоже, что textBoxNotes не существует. Но почему бы ему не существовать?


1022 * спасибо *

Ответы [ 2 ]

0 голосов
/ 15 января 2010

То, как вы ссылаетесь в Page_Load, происходит до того, как строки gridview действительно существуют. Поскольку это происходит в PostBack, GridView (и события запуска) должны быть воссозданы (заново: его строки заполнены) из ViewState. Хотя объекты на странице были инициированы и их значения были заполнены, GridView еще не был воссоздан, и его события не сработали.

Как уже упоминалось, это должно быть сделано в событии RowUpdating.

0 голосов
/ 24 апреля 2009

Когда происходит событие обновления, строка больше не находится в режиме редактирования. Поэтому textBoxNotes не существует на странице. Используйте обработчик событий RowUpdating вида сетки для доступа к элементам управления шаблона редактирования.

public void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
     TextBox1.Text = ((TextBox)GridView1.Rows[e.RowIndex]
                              .FindControl("textBoxNotes")).Text;
}
...