2010-01-04 2 views
4

У меня есть следующий код:связывания DataTable в виде сетки

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 

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

ответ

8

Ваше событие загрузки страницы вы не проверить, если это сообщение обратно:

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

Everytime нажать кнопку 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 

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

Я рекомендую хорошую книгу asp.net, такую ​​как Начало ASP.net 3.5 в C# 2008. Существует тонна книг vb.net по одному и тому же вопросу.

+0

Спасибо, что было очень полезно –

+0

Как отобразить представление сетки с порядком по столбцу в приведенном выше scienario – Vikram

0

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

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

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

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

+0

Я бы не хранили DataTable в сеансе, так как вы в основном сохраняете его в памяти на сервере. Что произойдет, если вы используете балансировку нагрузки на нескольких серверах? Что произойдет, если таблица будет больше, чем х число строк, или у вас есть число пользователей выше того, что у вас есть сегодня? – dustin

+0

Вот что делает решение JonH; вы должны хранить его где-нибудь или перезагружать из базы данных при каждой загрузке страницы; к сожалению, глобальная переменная не сохраняет никаких своих значений, поэтому она по существу теряется каждый раз .... но загрузка из БД или использование кеша или другого хранилища данных (файл io как XMl) - все жизнеспособные варианты тоже ... сеанс это не единственное решение, которое часто выбирается, потому что оно зависит от пользователя. И вы правы, много серверов тоже проблема ... так что вам нужно выяснить правильное решение. –

+0

@ dustinupdyke - нет ничего плохого в этом конкретном примере для хранения этого в сеансе. Я предполагаю, что вы прочитали вопрос, это довольно просто. Конечно, если ваше приложение будет сбалансировано по нагрузке, это совершенно другой вопрос сам по себе. Можно написать собственный механизм кэширования. В конце концов, вы должны знать, что выбрать. Создатель этого сообщения не ищет ничего высокого уровня, и сеанс отлично работает в этом случае. – JonH

0

Я Написал это ответ в этом LINK

Я Учитывая Полный код вашей проблемы.

Смежные вопросы