2011-12-20 5 views
0

관리자 수준의 사용자가 잠재적 인 회원 데이터가있는 양식을 채울 수 있도록하는 aspx 사이트에서 작업하고 있습니다. 양식이 작성되면 사용자가 제출을 클릭하면 데이터가 다른 테이블로 이동합니다. 나를 괴롭히는 양식의 한 부분은 세 개의 텍스트 상자 (txtFirstName, txtLastName, txtGrade)를 채우는 것입니다. 클릭하면 (btnAddStudent) 버튼이있어서 텍스트 상자의 정보를 표 모양의 표시 영역에 추가해야합니다. 내가 gridview를 사용하려고하지만 거기에 바인딩 할 수 없습니다. Student 테이블에서 빈 레코드를로드하는 멤버 ID 번호는 없습니다 (멤버 테이블에 대한 다 대일 관계 임). 회원 기록은이 양식이 작성하는 것이며, 제출 단추를 클릭하면 학생 자료가 학생 표에 추가됩니다.텍스트 상자에서 gridview에 데이터를 추가하려면 클릭하십시오.

현재 응답 코드 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> 

그리고 뒤에 코드 : 값과 포스트 뒤에 그 값을 유지 '텍스트 상자를 기반으로
을의 GridView를 바인딩하는 방법'

여기에 관련 소스 코드입니다.

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 

Page_Load 이벤트에서 "BindGrid()"가 호출됩니다.

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

이 그런 다음 다시 게시 후 그리드 새로 고치는 방법 만들고 사용하는

+0

코드를 제공 할 수 있습니까? 그것은 텍스트 단락보다 더 많은 정보를 전달할 것입니다. –

답변

0

시도 (그리고 그래, 내가 스크립트 관리자가) : 당신의 페이지로드

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

관련 문제