Как избежать RowDataBound при редактировании GridView?

В настоящее время у меня есть следующий код в RowDataBound:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label groupID = (Label)e.Row.FindControl("idgroup");
            LinkButton myLink = (LinkButton)e.Row.FindControl("groupLink");
            myLink.Attributes.Add("rel", groupID.Text);
        }
}

Однако, когда я нажимаю ссылку «Изменить», он пытается запустить этот код и выдает ошибку. Следовательно, как я могу запускать этот код ТОЛЬКО, когда GridView находится в режиме чтения? Но не при редактировании...


person aleafonso    schedule 14.09.2011    source источник


Ответы (5)


Вот как это сделать! Он будет выполнять код только над строками (в режиме чтения или редактирования), за исключением редактируемой строки!!!

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState == DataControlRowState.Normal) || (e.Row.RowState == DataControlRowState.Alternate))
            {
                Label groupID = (Label)e.Row.FindControl("idgroup");
                LinkButton myLink = (LinkButton)e.Row.FindControl("groupLink");
                myLink.Attributes.Add("rel", groupID.Text);
            }
        }
    }
person aleafonso    schedule 15.09.2011

вы можете добавить проверку следующим образом:

if (e.Row.RowState != DataControlRowState.Edit)
{
  // Here logic to apply only on initial DataBinding...
}
person Davide Piras    schedule 14.09.2011
comment
Я только что попробовал, но все же, когда нажимается ссылка на редактирование, это условие проходит. Следовательно, он не избегает запуска кода при редактировании. Любой другой вариант? Большое спасибо - person aleafonso; 14.09.2011
comment
можете ли вы отладить и проверить другие свойства объектов e или e.Row, чтобы узнать, можете ли вы определить статус редактирования строки и действовать соответствующим образом? :) - person Davide Piras; 14.09.2011
comment
Спасибо за совет мужик! Я только что разобрался с отладкой и просмотром объекта e.Row, как вы упомянули. Я опубликую его, как только stackoverflow позволит мне ответить на мой собственный вопрос. Ваше здоровье! - person aleafonso; 14.09.2011
comment
Вы можете отредактировать свой вопрос, поместив результаты внизу. - person Davide Piras; 14.09.2011

Добавьте чек для e.Row.RowState:

if ((e.Row.RowState & DataControlRowState.Edit) > 0)
{
    //In Edit mode
}
person Waqas    schedule 14.09.2011
comment
Это условие не подходит, так как код не запускается (даже когда я не нажимал на ссылку редактирования). Поэтому код в RowDataBound никогда не запускается. Любой другой вариант? Заранее спасибо! - person aleafonso; 14.09.2011
comment
+1. Как указано в комментарии к коду, этот блок выполняется, когда строка находится в режиме редактирования. Проверить обратное (не в режиме редактирования) можно либо заключив оператор в !(), изменив › на ==, либо добавив блок else (если вы используете блок if). - person Shmuel Valariola; 12.10.2012

Ответ Давиде почти правильный. Однако для чередующихся строк он не работает. Вот правильное решение:

if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState != DataControlRowState.Edit && e.Row.RowState != (DataControlRowState.Edit | DataControlRowState.Alternate))
{ 
    // Here logic to apply only on rows not in edit mode
}
person Sameer Alibhai    schedule 01.04.2012

В вашем представлении сетки найдите событие OnrowDataBound, которое будет похоже на OnrowDataBound="GridView1_RowDataBound", удалите этот код и отключите указанный выше код.

person Narender    schedule 14.09.2011
comment
Извините за недопонимание. Я хочу, чтобы RowDataBound запускался, но только тогда, когда GridView находится в режиме чтения (не в режиме редактирования после нажатия на ссылку редактирования). Спасибо, в любом случае - person aleafonso; 14.09.2011