2016-03-21 46 views
0

我在存儲和顯示數據表中的值時遇到了問題。我的目標是爲數據表添加一個值,重新加載頁面,然後顯示帶有附加值的數據表並提供輸入更多的功能。目前,我甚至無法獲取數據表。我確信這是將數據保存在會話中的問題,但我根本無法從會話保存/加載工作。使用會話變量在數據表中創建和存儲值

我對你們可以給予我的任何幫助表示歉意,我很抱歉如果這件事真的非常簡單。似乎我只是需要第二個意見。

這是我目前的網頁,

<%@ 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:對象引用未設置爲對象的實例。」因爲當它試圖加載新的datarow「dtRow」時,dtRow和MyDT都爲空。 –

+0

嘿!似乎修復了它,對此感到遺憾。非常感謝你,我真的很感激。 –

+0

您確定您在Page_Load中具有將Session [「MyDT」]分配給表的else語句嗎?如果你確實有這個問題,那我的下一個問題就是你使用的瀏覽器是什麼?此外,請設置一個斷點並測試您的Session類以確保它正在保存數據。您的安全設置可能會阻止該問題。 –

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