привязка данных к виду сетки - PullRequest
4 голосов
/ 04 января 2010

У меня есть следующий код:

Imports System.Data

Partial Class Students_AddWishes Inherits System.Web.UI.Page

    Public dt As New DataTable

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        dt.Columns.Add("ID", System.Type.GetType("System.Int32"))
        dt.Columns.Add("univirsity", System.Type.GetType("System.Int32"))
        dt.Columns.Add("major", System.Type.GetType("System.Int32"))
    End Sub

    Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        Dim row1 As DataRow = dt.NewRow()
        row1("ID") = dt.Rows.Count + 1
        row1("univirsity") = ddlUnivs.SelectedValue
        row1("major") = ddlMajors.SelectedValue
        dt.Rows.Add(row1)
        GridView1.DataSource = dt
        GridView1.DataBind()
    End Sub

End Class

Проблема в том, что он показывает только одну строку или запись. Как сделать так, чтобы показывалось много записей?

Ответы [ 2 ]

9 голосов
/ 04 января 2010

Событие загрузки вашей страницы, которое вы не проверяете, является ли это возвращением:

 If Not IsPostBack Then
     'process code if it is not a post back
 End If

Каждый раз, когда вы нажимаете кнопку btnAdd, ваша страница отправляет сообщение обратно на сервер.

Я только что заметил, что вы, вероятно, не понимаете время жизни объекта.

Вы сделали это в своем коде:

Public dt As New DataTable 

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

Вы должны будете использовать переменные сеанса или базу данных для хранения состояния dt.

Вот пример на C #:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", System.Type.GetType("System.Int32"));
            dt.Columns.Add("univirsity", System.Type.GetType("System.Int32"));
            dt.Columns.Add("major", System.Type.GetType("System.Int32"));
            Session["MyDataTable"] = dt;
        }
    }

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        DataTable t = (DataTable)Session["MyDataTable"];
        DataRow row1 = t.NewRow();

        row1["ID"] = t.Rows.Count + 1;
        row1["univirsity"] = 3;
        row1["major"] = 31;
        t.Rows.Add(row1);

        Session["MyDataTable"] = t;
        GridView1.DataSource = t;
        GridView1.DataBind(); 
    }

И тот же код в vb.net:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) 
    If Not Page.IsPostBack Then 
        Dim dt As New DataTable() 
        dt.Columns.Add("ID", System.Type.[GetType]("System.Int32")) 
        dt.Columns.Add("univirsity", System.Type.[GetType]("System.Int32")) 
        dt.Columns.Add("major", System.Type.[GetType]("System.Int32")) 
        Session("MyDataTable") = dt 
    End If 
End Sub 

Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim t As DataTable = DirectCast(Session("MyDataTable"), DataTable) 
    Dim row1 As DataRow = t.NewRow() 

    row1("ID") = t.Rows.Count + 1 
    row1("univirsity") = 3 
    row1("major") = 31 
    t.Rows.Add(row1) 

    Session("MyDataTable") = t 
    GridView1.DataSource = t 
    GridView1.DataBind() 
End Sub 

Итак, теперь код выполняет создание нового объекта с данными, пока мы находимся на странице (первое сообщение назад) и добавляет столбцы. Как только он определил таблицу данных, мы переходим в состояние сеанса. Когда вы нажимаете кнопку добавления, вы не можете в своем предыдущем коде просто продолжать использовать dt, потому что область действия dt была потеряна в предыдущем коде. Мы делаем это, назначая сессионный источник данных, который был сохранен до временного источника данных. Мы добавляем строку и сбрасываем сессию таким образом, при следующем добавлении строки будет отображаться вторая строка, затем третья строка и так далее ...

Я рекомендую хорошую книгу asp.net, такую ​​как Beginning ASP.net 3.5 в C # 2008. Есть тонна книг vb.net на ту же тему.

0 голосов
/ 04 января 2010

Вам необходимо сохранить данные в Session, потому что локальные переменные не сохраняются. Так что вам нужно сделать:

protected override OnLoad(..) //or OnInit
{
   dt = Session["DataTable"] as DataTable;
   if (dt == null)
   {
       dt = new DataTable();
       //load columns
   }
}

protected override OnUnLoad(..)
{
   Session["DataTable"] = dt;
}

Сеанс сохраняет ссылку на таблицу данных через обратные передачи, так как в Интернете отсутствует состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...