GridView не выполняет правильную привязку после обратной передачи - PullRequest
7 голосов
/ 19 ноября 2009

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

<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();
}

Ответы [ 6 ]

13 голосов
/ 18 августа 2010

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

3 голосов
/ 19 ноября 2009

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

С Обзор ASP.NET Page Framework :

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

Где, как

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

Действует

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

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

2 голосов
/ 20 ноября 2009

У меня была похожая проблема с динамическим связыванием 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();
}
2 голосов
/ 20 ноября 2009

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

  TestGridView.Columns.RemoveAt(0); 

но вы действительно имели в виду

  TestGridView.Rows.RemoveAt(0); 

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

0 голосов
/ 12 сентября 2017

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

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">
0 голосов
/ 20 ноября 2009

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

...