2011-12-20 17 views
0

私は管理者レベルのユーザーが潜在的なメンバーデータを持つフォームに記入できるaspxサイトで作業しています。フォームに記入すると、ユーザーはsubmitをクリックし、データは別のテーブルに送られます。私を悩ましているフォームの1つは、3つのテキストボックス(txtFirstName、txtLastName、txtGrade)を入力することです。私はボタン(btnAddStudent)を持っています。クリックすると、テキストボックスの情報を表のような表示領域に追加する必要があります。私はグリッドビューを使用しようとしていますが、バインドするものはありません。 Studentテーブルから空のレコードをロードするためのmemberID番号はありません(メンバーテーブルとの多対1の関係)。メンバーレコードは、このフォームが作成しているもので、[送信]ボタンをクリックすると、学生データがStudentテーブルに追加されます。グリッドビューにデータを追加するには、ボタンをクリックして

私は現在、応答 hereにあるコードを使って作業しています。しかし、私は "学生の追加"ボタンをクリックすると、私は新しい空の行を取得しますが、私のテキストボックスの値は、gridviewに入力されていません。

テーブルを使用してテキストボックスの行を動的に追加する必要がありますか?

<tr>  
    <td class="style8"> 
    <asp:Label ID="Label18" runat="server" Text="Chidren:" Font-Bold="True" Font-      Underline="True" Font-Names="Tahoma"></asp:Label> 
    </td> 
</tr> 
<tr> 
    <td class="style8"> 
    <asp:Label ID="Label19" runat="server" Text="First Name:"></asp:Label> 
    </td> 
    <td class="style7"> 
    <asp:TextBox ID="txtChildFirstName" runat="server" CssClass="textbox"></asp:TextBox> 
    </td> 
    <td class=""> 
    <asp:Label ID="Label20" runat="server" Text="Last Name:"></asp:Label> 
    </td> 
    <td class="style6"> 
    <asp:TextBox ID="txtChildLastName" runat="server" CssClass="textbox"></asp:TextBox> 
    </td> 
    <td class="style5" align="right"> 
    <asp:Label ID="Label21" runat="server" Text="Grade:"></asp:Label> 
    </td> 
    <td class="style4"> 
    <asp:TextBox ID="txtGrade" runat="server" Width="52px" CssClass="textbox"></asp:TextBox> 
    </td> 
    <td> 
    <asp:Button ID="btnAddChild" runat="server" Text="Add Child" OnClick="btnAddChild_Click" /> 
    </td> 
</tr> 
<tr> 
    <td valign="top" class="style8"> 
    <asp:Label ID="Label22" runat="server" Text="Student List:"></asp:Label> 
    </td> 
    <td colspan="3"> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
     <asp:GridView ID="gvStudentList" runat="server" AutoGenerateColumns="False" 
              PageSize="5" Height="42px"> 
              <AlternatingRowStyle BackColor="#E0E0E0" /> 
      <Columns> 
       <asp:BoundField AccessibleHeaderText="FirstName" HeaderText="First Name" /> 
       <asp:BoundField AccessibleHeaderText="LastName" HeaderText="Last Name" /> 
       <asp:BoundField AccessibleHeaderText="Grade" HeaderText="Grade" /> 
      </Columns> 
      <HeaderStyle BackColor="#CCCCCC" Height="25px" /> 
      <RowStyle Height="22px" /> 
     </asp:GridView> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

そして、背後にあるコード: 値とポストの背中にその値を保持「のTextBoxに基づいて
をGridViewコントロールにバインドする方法」

はここで、関連するソースコードです。 "BindGrid()が" Page_Loadイベントで呼び出されると

Private Sub BindGrid(rowcount As Integer) 
    Dim dt As New DataTable() 
    Dim dr As DataRow 
    dt.Columns.Add(New System.Data.DataColumn("FirstName", GetType([String]))) 
    dt.Columns.Add(New System.Data.DataColumn("LastName", GetType([String]))) 
    dt.Columns.Add(New System.Data.DataColumn("Grade", GetType([String]))) 

    If ViewState("CurrentData") IsNot Nothing Then 
     For i As Integer = 0 To rowcount 
      dt = DirectCast(ViewState("CurrentData"), DataTable) 
      If dt.Rows.Count > 0 Then 
       dr = dt.NewRow() 

       dr(0) = dt.Rows(0)(0).ToString() 
      End If 
     Next 
     dr = dt.NewRow() 
     dr(0) = txtChildFirstName.Text 
     dr(1) = txtChildLastName.Text 
     dr(2) = txtGrade.Text 

     dt.Rows.Add(dr) 
    Else 
     dr = dt.NewRow() 
     dr(0) = txtChildFirstName.Text 
     dr(1) = txtChildLastName.Text 
     dr(2) = txtGrade.Text 


     dt.Rows.Add(dr) 
    End If 

    ' If ViewState has a data then use the value as the DataSource 
    If ViewState("CurrentData") IsNot Nothing Then 
     gvStudentList.DataSource = DirectCast(ViewState("CurrentData"), DataTable) 
     gvStudentList.DataBind() 
    Else 
     ' Bind GridView with the initial data assocaited in the DataTable 
     gvStudentList.DataSource = dt 

     gvStudentList.DataBind() 
    End If 
    ' Store the DataTable in ViewState to retain the values 
    ViewState("CurrentData") = dt 

End Sub 

Protected Sub btnAddChild_Click(sender As Object, e As EventArgs) Handles btnAddChild.Click 
    ' Check if the ViewState has a data assoiciated within it. If 
    If ViewState("CurrentData") IsNot Nothing Then 
     Dim dt As DataTable = DirectCast(ViewState("CurrentData"), DataTable) 
     Dim count As Integer = dt.Rows.Count 
     BindGrid(count) 
    Else 
     BindGrid(1) 
    End If 
    txtChildFirstName.Text = String.Empty 
    txtChildLastName.Text = String.Empty 
    txtGrade.Text = String.Empty 

    txtChildFirstName.Focus() 
End Sub 

。 (そして、はい、私はのScriptManagerを持っている)

+0

あなたはコードを提供できますか?それはテキストの段落よりも多くの情報を伝えるでしょう。 –

答えて

0

それからちょうどポストバック後にグリッドをリフレッシュする方法作成

Session("CurrentData") = dt on your BindGrid() 

を使用してみてください:ちょうど呼び出すあなたのページの負荷で

Private Sub RefreshGrid() 
{ 
If ViewState("CurrentData") IsNot Nothing Then 
gvStudentList.DataSource = DirectCast(Session("CurrentData"), DataTable) 
gvStudentList.DataBind() 
Else 
gvStudentList.DataSource = null; 
gvStudentList.DataBind() 
EndIf 
} 

を:

If IsPostBack Then 
      Return 
    End If 
    RefreshGrid() 

よろしくお願いいたします。

+0

私はこれらの変更を行いましたが、今度はブランク行を最初に追加し、その後の各ボタンクリックの後には何も追加しません。私はすべての "ViewState(" CurrentData ")をSessionに変更する必要がありますか?私はコメントで参照されているものだけを変更しました。ありがとう。 – NJohns

+0

ViewStateをすべてSessionに変更しました。今は行を追加しますが、まだ空です。私は検索を続けます。 – NJohns

関連する問題