2009-11-18 4 views
7

У меня есть GridView, который имеет DataSourceID, указывающий на объект ObjectDataSource. Объект ObjectDataSource указывает на метод, который возвращает LINQ IQueryable, используя свойства TypeName, SelectMethod и SelectCountMethod элемента управления ObjectDataSource. Что происходит, так это то, что данные загружаются должным образом. Однако при обратной передаче, если я удалю строки из GridView и попытаюсь выполнить повторную проверку с использованием явного GridView.DataBind(), это не сработает. Я знаю, что LINQ возвращает правильный номер строки и т. Д., Потому что я назвал метод count, и он возвращает правильный ряд строк. Вот простой пример:GridView не Rebinding должным образом после обратной передачи

<asp:GridView ID="TestGridView" runat="server" PageSize="20" 
    AutoGenerateColumns="false" AllowPaging="true" 
    AllowSorting="false" DataSourceID="TestDataSource"> 
    <Columns> 
     ... 
    </Columns> 
</asp:GridView> 

<asp:ObjectDataSource ID="TestDataSource" runat="server" 
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" /> 

Я попытался добавить кнопку и добавить TestGridView.DataBind(); метод к этому. Я попытался добавить его в событие Page_PreRender. Независимо от того, что я пытаюсь, он не работает.

Как кто-то предложил ниже, я попытался переместить его в Page_Load, а также нет. Вот грубый пример моего кода:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     // Set "initial" query parameters, then ... 
     BindData(); 
    } 
} 

private void BindData() 
{ 
    // EDITED: Removed the code below since I'm not looking to delete the 
    //   rows from the database, but rather get the GridView to rebind 
    //   which its not. 
    ////Remove all current rows from the GridView 
    //int colCount = TestGridView.Rows.Count; 
    //for (int x = 1; x <= colCount; x++) 
    //{ 
    // TestGridView.DeleteRow(x); 
    //} 

    // Bind GridView to the ObjectDataSource 
    TestGridView.DataBind(); 
} 

protected void RegenerateImageButton_Click(object sender, ImageClickEventArgs e) 
{ 
    // Set "updated" query parameters, then ... 
    BindData(); 
} 
+0

Изменено выше. –

ответ

0

Посмотрев в коде, который немного больше, я наткнулся на значения свойств страницы, хранящиеся в ViewState. Как только я сменил его на Сессию, они работают.

+6

Если вы объясните это немного подробнее, я соблазню +1 ваше решение. ;) –

3

Тупая идея, но вы проверили событие загрузки страницы с if(!Page.IsPostBack)?

От ASP.NET Page Framework Overview:

Page_Load: Во время этого мероприятия, вы можете выполнить ряд действий, либо создать страницу ASP.NET в первый раз или ответить на стороне клиента событий, которые являются результатом Почта. Состояние просмотра страницы и контроля было восстановлено до этого события. Используйте свойство страницы IsPostBack, чтобы убедиться, что это первый раз, когда страница обрабатывается. Если это первый раз, выполните привязку данных. Также читайте и обновляйте свойства управления.

Где, как

Page_PreRender: Событие PreRender обжигают непосредственно перед сохранением состояния просмотра и управления оказаны. Вы можете использовать это событие для выполнения любых действий в последний момент на ваших элементах управления.

В действительности

Поскольку структура страницы является лицом без гражданства а и отсоединена моделью, каждый раз, когда клиент запрашивает страницу .aspx, многие вещи происходят во время обработки страницы ...

Таким образом, вы можете выполнять проверку перед установкой viewstate, а не после восстановления состояния viewstate. Наиболее распространенное место для проверки if(!Page.IsPostBack) обычно находится в событии Page_Load.

+0

Да. Посмотрите ниже пример кода: «Я попытался добавить кнопку и добавить к ней метод TestGridView.DataBind(). Я попытался добавить его к событию Page_PreRender. Независимо от того, что я пытаюсь, он не работает». –

+0

Да, даже в случае Page_Load это не работает. –

+0

Обновленный код, чтобы показать вам, что я делаю. –

2

Ваш пример показывает

TestGridView.Columns.RemoveAt(0); 

но вы на самом деле означает

TestGridView.Rows.RemoveAt(0); 

(и это проблема?)

+0

Ничего себе. Спасибо Джеффу. Это помогает, но это не решает мою проблему. –

2

У меня была аналогичная проблема с динамически связывать TreeView с XmlDataSource, который изменил источник xml при каждой обратной передаче.Установка EnableCache в false исправила его. Вы пробовали это? (Рассмотрим объект Linq2SQL уже кэширует, если ваш IQueryable использует объект Linq2SQL, то есть)

<asp:ObjectDataSource ID="TestDataSource" runat="server" EnableCaching="false" 
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" /> 

, если это не сработает, попробуйте это в сочетании с вышесказанным:

protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 
    BindData(); 
} 
+0

Нет. Все еще не работает. Спасибо хоть! –

+0

Спасибо, но я думаю, что понял. Полностью не связанная проблема. –

13

Gridviews не привязаны к обратной передаче, их строки оттягиваются назад из viewstate. Сброс значения DatasourceID gridview для идентификатора источника данных объекта при загрузке страницы (или init?) Приведет к отскоку сетки.

+0

Да, отличный ответ! – Petras

+0

работал на меня .... спасибо –

+1

Очень хорошее объяснение, но если проблема в ViewState, правильный способ ее решения - добавить EnableViewState = "false" в ваш GridView. – Trajan

0

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

The GridView был связан с ObjectDataSource, и проблема возникла после того, как я включил свой объект подкладочный от DataSet к Entity Framework запроса

Благоприятная ViewState для GridView сделал трюк для меня, таким образом:

<asp:GridView ID="GridViewTransporters" PageSize="100" 
runat="server" AllowPaging="True" AllowSorting="True" 
AutoGenerateColumns="False" DataSourceID="ObjectDataSourceTransporters" 
DataKeyNames="Id" EnableViewState="True"> 
Смежные вопросы