RmcbainTheThird Ответов: 1

Как найти текст элемента управления в gridview


хорошо у меня есть этот пункт в моем gridView:
asp:TemplateField HeaderText="BulletGroup ID" SortExpression="BulletGroupID">
       <ItemTemplate>
                     <asp:Label ID="lblBulletGroupID" Text='<%# Eval("BulletGroupID") %>' runat="server"></asp:Label>
                  </ItemTemplate>
                  <EditItemTemplate>
                     <asp:Label ID="BulletGroupID" Text='<%# Eval("BulletGroupID") %>' runat="server"></asp:Label>
                  </EditItemTemplate>
                  <FooterTemplate>
                     <asp:TextBox ID="txtBulletGroupID" Text='' runat="server"></asp:TextBox>
                  </FooterTemplate>
       </asp:TemplateField>

представление сетки успешно заполняется источником данных типа List<>
и в событии OnRowDataBound я пытаюсь получить значение из этого шаблона элемента и создаю объект DataRowView таким образом:
DataRowView tmp = (DataRowView)row.DataItem;

однако я получаю null обратно для tmp
это означает, что эта строка выдаст нулевое исключение:
int BulletGroupID = int.Parse( (tmp)["BulletGroupID"].ToString());


Я также попытался получить значение обратно с помощью этого вызова:
int BulletGroupID = int.Parse( ((Label)row.FindControl("lblBulletGroupID")).Text);


Что также вызывает нулевое исключение

Помоги мне Обиван ты моя единственная надежда

Что я уже пробовал:

Изучение нескольких примеров использования Gridview

1 Ответов

Рейтинг:
7

Vincent Maverick Durano

Ты получаешь null потому что вы ссылаетесь на элемент управления изнутри EditItemTemplate который может быть доступен только тогда, когда GridView на Edit режим. Вам нужно проверить наличие RowType и RowState перед получением доступа к любым элементам управления из GridView около OnRowDataBound событие. Вот пример того, как вы можете получить доступ к элементу управления из ItemTemplate:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
         Label lblGroupBulletID = (Label)e.Row.FindControl("lblBulletGroupID");
         //do something here

    }
}


Как вы можете видеть доступ к элементу управления из ItemTemplate это довольно прямолинейно, так как мы будем проверять только RowType типа DataRow. Однако доступ к элементу управления из EditItemTemplate требуется дополнительная проверка. Вот вам пример:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if ((e.Row.RowState & DataControlRowState.Edit) > 0)
        {
            Label lblEditGroupBulletID = (Label)e.Row.FindControl("BulletGroupID");
            //do something here

        }
    }
}


Сначала мы проверяем RowType чтобы убедиться, что мы манипулируем только строками типа DataRow Пожалуйста, обратите внимание, что GridView состоит из нескольких типов строк, таких как Header, DataRow, EmptyDataRow, Footer, Pager и Separator Следующая строка в блоке кода выше-это критическая часть кода, которая должна определить Edit государство.

Доступ к элементам управления из <edititemtemplate> немного сложен, особенно если вы действительно не знакомы с тем, как этот материал работает внутри GridView. Приравнивая RowState к DataControlState.Edit это не совсем точно, и при этом вы можете получить исключение. То RowState свойство-это побитовая комбинация. Таким образом, RowState может указывать на то, что вы находитесь в Edit государство и Alternate государство. Следовательно, вы не можете сделать простую проверку равенства, когда находитесь внутри Edit режим. Вместо этого вы должны сделать что-то вроде этого:

if ((e.Row.RowState & DataControlRowState.Edit) > 0)   
{  
     //access controls here  
} 


Мы используем побитовое “&” оператор, чтобы определить, если GridView в Edit режим и проверьте результат, если он больше нуля. Подробнее о Побитовом операторе см.: Побитовые операторы в языке Си#[^] .

Как только нам удастся определить Edit состояние, теперь вы можете начать доступ к элементам управления с помощью FindControl() метод, как это обычно делается при ссылке на элемент управления из элемента управления представлением данных, например GridView.

Надеюсь, это поможет!


RmcbainTheThird

спасибо, Винсент. Моя большая ошибка заключалась в том, что событие OnRowDataBound было вызвано только один раз( строковая часть имени события должна была быть подсказкой :) )