2016-03-21 2 views
0

У меня возникла проблема с хранением и отображением значений из datatable. Моя цель - добавить значение к datatable, перезагрузить страницу, а затем отобразить datatable с добавленным значением и дать возможность ввести больше. В настоящее время я даже не могу получить таблицу данных. Я уверен, что это проблема с сохранением данных в сеансе, но я просто не могу заставить экономить/загружать сессию работать.Создание и сохранение значений в Datatable Использование переменной сеанса

Я предлагаю любую помощь, которую вы, ребята, можете мне дать, и я прошу прощения, если это что-то действительно ослепительно простое. Кажется, мне просто нужно второе мнение.

Это мой текущий веб-страницы,

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <p><asp:TextBox ID="txtName" runat="server"></asp:TextBox><asp:TextBox ID="txtEmail" runat="server"></asp:TextBox><asp:TextBox ID="txtAddress" runat="server"></asp:TextBox><asp:TextBox ID="txtInfo" runat="server"></asp:TextBox></p> 
    <p> 
     <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click"/></p> 
    </div> 
    <div> 
     <table border="1"> 
      <asp:Repeater ID="rptrData" runat="server"> 
       <HeaderTemplate> 
        <tr> 
         <td>Name</td> 
         <td>Email</td> 
         <td>Address</td> 
         <td>Info</td> 
        </tr> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <tr> 
         <td><%#Eval("Name") %></td> 
         <td><%#Eval("Email") %></td> 
         <td><%#Eval("Address") %></td> 
         <td><%#Eval("Info") %></td> 
        </tr> 
       </ItemTemplate> 
       <AlternatingItemTemplate> 
        <tr> 
         <td><%#Eval("Name") %></td> 
         <td><%#Eval("Email") %></td> 
         <td><%#Eval("Address") %></td> 
         <td><%#Eval("Info") %></td> 
        </tr> 
       </AlternatingItemTemplate> 
      </asp:Repeater> 
     </table> 
    </div> 
    </form> 
</body> 
</html> 

И мой текущий код позади,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Net.Mail; 
using System.Net; 
using System.Data; 
using System.Collections; 

namespace WebApplication1 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     public DataTable MyDT = new DataTable(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       DataTable MyDT = (DataTable)Session["MyDT"]; 
       rptrData.DataSource = MyDT; 
       rptrData.DataBind(); 
      } 
     } 
     protected void btnAdd_Click(object sender, EventArgs e) 
     { 
      //DataTable MyDT = new DataTable(); 
      MyDT.Columns.Add("Name"); 
      MyDT.Columns.Add("Address"); 
      MyDT.Columns.Add("Email"); 
      MyDT.Columns.Add("Info"); 
      string Name = txtName.Text; 
      string Address = txtAddress.Text; 
      string Email = txtEmail.Text; 
      string Info = txtInfo.Text; 

      DataRow dtRow = MyDT.NewRow(); 
      dtRow["Name"] = Name; 
      dtRow["Address"] = Address; 
      dtRow["Email"] = Email; 
      dtRow["Info"] = Info; 

      Session.Add("MyDT", MyDT); 
     } 
    } 
} 
+0

Вы хотите только добавить столбцы в один из следующих данных, я рекомендую загружать страницы, но не каждый раз, когда вы нажимаете кнопку «Добавить». –

ответ

1

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

public DataTable MyDT; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     MyDT = new DataTable(); 
     MyDT.Columns.Add("Name"); 
     MyDT.Columns.Add("Address"); 
     MyDT.Columns.Add("Email"); 
     MyDT.Columns.Add("Info"); 
     Session["MyDT"] = MyDT; 
    } 
    else 
    { 
     // Here we load the session datatable to the variable you declared at the top. 
     // It will be ready for us in the button click event. We know this because 
     // of asp.net page lifecycle which will run the page_load before the button 
     // click event. 

     MyDT = (DataTable)Session["MyDT"]; 
    } 

    // You can bind the repeater here also if you want. Doesn't really make a huge difference 
} 



protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    string Name = txtName.Text; 
    string Address = txtAddress.Text; 
    string Email = txtEmail.Text; 
    string Info = txtInfo.Text; 

    DataRow dtRow = MyDT.NewRow(); 
    dtRow["Name"] = Name; 
    dtRow["Address"] = Address; 
    dtRow["Email"] = Email; 
    dtRow["Info"] = Info; 
    MyDT.Rows.Add(dtRow); 

    rptrData.DataSource = MyDT; 
    rptrData.DataBind(); 
} 

Вы заметите, что мне даже не нужно сохранять возвращаемые данные обратно в переменную сеанса. DataTable является ссылочным типом, поэтому любые изменения, которые я делаю для переменной MyDT, сохраняются в том же месте, на которое указывает переменная Session.

Я также удалил новое объявление наверху, если ваш класс для MyDT. Тебе это не нужно.

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

+0

Эй, большое спасибо за вашу помощь. Код выглядит намного чище, я многому научился у него. У меня есть одна проблема, она бросает «System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта». потому что когда он пытается загрузить новый dataro «dtRow», оба dtRow и MyDT равны нулю. –

+0

Эй! Кажется, исправил это, извините за это. Большое вам спасибо, я очень ценю это. –

+0

У вас есть оператор else в Page_Load, который назначает сеанс [MyDT] для таблицы? Если у вас есть это, то мой следующий вопрос - какой браузер вы используете? Кроме того, установите точку останова и проверьте свой класс сеанса, чтобы убедиться, что он сохраняет данные. Настройки безопасности могут блокировать это. –

0

У меня есть решение для этого в VB, не имеют времени, чтобы преобразовать в C# я, но, надеюсь, это поможет.

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

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If Not IsPostBack Then 

     CreateDetailTable() 

    End If 

End Sub 


''' <summary> 
''' create the detail table and store in a session var 
''' </summary> 
''' <remarks></remarks> 

Private Sub CreateDetailTable() 

    Dim dt As New DataTable 

    dt.Columns.Add("McsStatusId") 
    dt.Columns.Add("McsHeaderId") 
    dt.Columns.Add("SeqNo") 
    dt.Columns.Add("Status") 
    dt.Columns.Add("DateTime") 
    dt.Columns.Add("Timezone") 
    dt.Columns.Add("Location") 
    dt.Columns.Add("State") 
    dt.Columns.Add("Country") 
    dt.Columns.Add("Comments") 
    dt.Columns.Add("TransmittedFlag") 
    dt.Columns.Add("TransmissionNo") 
    dt.Columns.Add("AddUserId") 
    dt.Columns.Add("AddTime") 
    dt.Columns.Add("LastUserId") 
    dt.Columns.Add("LastTime") 
    dt.Columns.Add("DeleteFlag") 

    Session(hdnSessionVar.Value) = dt 

End Sub 


''' <summary> 
''' add detail record to the table stored in the session, then use this table to refresh the grid 
''' </summary> 
''' <remarks></remarks> 

Private Function AddDetailToGrid() As Boolean 

    Dim rtn As Boolean = False 

    Try 

     Dim u As New ClassUserProfile 
     u.GetUserFromSession() 

     Dim dt As DataTable = TryCast(Session(hdnSessionVar.Value), DataTable) 
     Dim dr As DataRow 

     dr = dt.NewRow 

     dr("McsStatusId") = 0 'filler 
     dr("McsHeaderId") = hdnMcsHeaderId.Value 'filler 
     dr("SeqNo") = 0 'filler 
     dr("Status") = ddlStatus.SelectedItem.Text.Trim 
     dr("DateTime") = txtStatusDate.Text.Trim & " " & txtStatusTime.Text.Trim 
     dr("Timezone") = ddlTimezones.SelectedItem.Text.Trim 
     dr("Location") = txtStatusLocation.Text.Trim 
     dr("State") = txtStatusState.Text.Trim 
     dr("Country") = txtStatusCountry.Text.Trim 
     dr("Comments") = txtStatusComments.Text.Trim 
     dr("TransmittedFlag") = 0 'these two fields should not be able to be added by user, they will be updated in a DB job that runs, and 
     dr("TransmissionNo") = 0 'once they are set this status detail record will no longer be editable 
     dr("AddUserId") = 0 'filler 
     dr("AddTime") = DateTime.Now 'filler 
     dr("LastUserId") = 0 'filler 
     dr("LastTime") = DateTime.Now 'filler 
     dr("DeleteFlag") = 0 'filler 

     If hdnSeqNo.Value = "" Then 
      dt.Rows.Add(dr) 
     Else 
      dt.Rows.InsertAt(dr, hdnSeqNo.Value) 
     End If 

     Session(hdnSessionVar.Value) = dt 'update the session var 

     'bind the grid 
     gridMcsStatus.DataSource = dt 
     gridMcsStatus.DataBind() 

     rtn = True 

    Catch ex As Exception 

     mbStatus.ShowErrorMsg("There was an error adding to the grid: " & ex.ToString) 

    End Try 

    Return rtn 

End Function 

''' <summary> 
''' bind the session var containing the table data to the grid 
''' </summary> 
''' <remarks></remarks> 

Private Sub BindStatusDetailGrid() 

    Using dt As DataTable = TryCast(Session(hdnSessionVar.Value), DataTable) 

     gridMcsStatus.DataSource = dt 
     gridMcsStatus.DataBind() 

    End Using 

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