GridView подкачки внутри компонентов UpdatePanel или PlaceHolder - PullRequest
0 голосов
/ 26 декабря 2009

Я новичок в ASP.NET.

Я занимаюсь разработкой веб-формы ASP.NET C #, которая динамически создает GridView компоненты и заполняет их, используя данные, полученные от моего веб-сервиса.

Я создаю эти GridView компоненты программно на стороне сервера (файл cs) - он должен быть гибким - 1 GridView и иногда 10 GridView компонентов.

Проблема возникает, когда я пытаюсь добавить нумерацию страниц - всякий раз, когда пользователь нажимает «следующую» страницу, вся страница обновляется из-за postBack, и я теряю все свои данные, и страница возвращает пустое / пустое значение. .

Я использовал PlaceHolder для хранения компонентов GridView, при поиске решения я нашел UpdatePanel в качестве лучшей альтернативы - насколько я понимаю, страницу можно частично обновить - это означает, что только UpdatePanel должен быть обновлен ... но это не работает.

Следующий пример кода - мой ТЕСТ, UpdatePanel - единственный компонент, инициируемый на стороне клиента (страница .aspx), остальные - программно в .cs.

как я могу решить проблему, описанную выше?

Почему вся страница обновляется, и я теряю свои данные? Вы можете порекомендовать другой способ? можете предоставить мне любой пример кода?

Если я не перестраиваю GridView, это не сработает ...

Вот мой Default.aspx.cs

public partial class TestAjaxForm : System.Web.UI.Page
{
    DataTable table;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            bindGridView();
    }

    public void bindGridView()
    {

        GridView gridView1 = new GridView();
        gridView1.AutoGenerateColumns = true;

        gridView1.PageSize = 2;
        gridView1.AllowPaging = true;
        gridView1.PagerSettings.Mode = PagerButtons.Numeric;
        gridView1.PagerSettings.Position = PagerPosition.Bottom;
        gridView1.PagerSettings.PageButtonCount = 10;
        gridView1.PageIndexChanging += new GridViewPageEventHandler(this.GridView1_PageIndexChanging);

        table = new DataTable();
        table.Columns.Add("FirstName");
        table.Columns.Add("LastName");

        DataRow row = table.NewRow();
        row["FirstName"] = "John";
        row["LastName"] = "Johnoson";
        table.Rows.Add(row);

        row = table.NewRow();
        row["FirstName"] = "Johnny";
        row["LastName"] = "Marley";
        table.Rows.Add(row);

        row = table.NewRow();
        row["FirstName"] = "Kate";
        row["LastName"] = "Li";
        table.Rows.Add(row);

        panel.ContentTemplateContainer.Controls.Add(gridView1);

        gridView1.DataSource = table;
        gridView1.DataBind();

    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView gridView1 = (GridView)sender;
        gridView1.PageIndex = e.NewPageIndex;
        gridView1.DataSource = table;
        gridView1.DataBind();
    }
}

Спасибо.

Ответы [ 3 ]

1 голос
/ 26 декабря 2009

Если вы хотите, чтобы пользовательский подход к GridView работал, вы должны воссоздавать и перепривязывать сетку при каждой загрузке страницы ... в этом проблема динамических сеток ... Динамические элементы управления не сохраняют свое состояние просмотра, но если вы добавили сетка и динамически генерируемые столбцы, это будет работать для вас легче (потому что я думаю, что он может динамически запоминать столбцы, или вы можете установить AutoGenerateColumns в значение true, и это приводит к именам столбцов строк данных).

НТН

0 голосов
/ 04 сентября 2011

Я думаю, что самое простое, что нужно сделать, это объявить gridview на странице aspx внутри заполнителя, в то время как заполнитель также находится внутри панели обновлений.

Насколько я вижу, Джон не делает ничего, что не может быть объявлено в самой разметке, так что это не должно быть проблемой. Если по какой-то причине вид сетки не должен отображаться на экране, достаточно установить для свойства Visible заполнителя значение false.

Что касается разбиения на страницы, как правильно указывает RickNz, он сохранит состояние только в том случае, если вы связываете gridview с LinqDatasource, SqlDatasource или ObjectDatasource, но если вы связываете его с пользовательскими бизнес-объектами, что вам нужно сделать сохранить данные в сеансе и снова связать их на PageIndexChanged.

В псевдокоде было бы что-то вроде этого.

Page_load
{
     If (!IsPostBack)
     Binddata();
 }

 private void Binddata()
 {
     var data = Getdata();
     Gridview1.DataSource= data;
     Gridview.DataBind();
     Session["data"]=data; // cache the data 
  }

 protected void Gridview1_indexchanged(object sender, GridviewPageEventArgs e)
 {
      var data= Session["data"];
      Gridview1. DataSource=data;
      Gridview1.DataBind();
      GridView1.PageIndex=e.NewPageIndex;
  }
0 голосов
/ 26 декабря 2009

Вы должны создать свой GridView и добавить его в дерево элементов управления в обработчике событий PreInit или Init, чтобы у них была возможность правильно привязаться к ViewState, и это должно быть сделано независимо от того, существует ли обратная передача: Если добавить их в постбэк, то их явно не будет там, чтобы что-либо показывать.

Привязка данных может произойти позже в жизненном цикле страницы.

Пейджинг работает только в том случае, если вы также используете ObjectDataSource; Мне никогда не удавалось заставить его работать с GridView.

...