Добавить данные в gridview, из текстового поля, по нажатию кнопки - PullRequest
0 голосов
/ 21 декабря 2011

Я работаю над сайтом aspx, который позволяет пользователю уровня администратора заполнять форму с данными потенциальных участников. После заполнения формы пользователь нажимает кнопку «Отправить», и данные отправляются в разные таблицы. Одна часть формы, которая озадачивает меня, включает заполнение трех текстовых полей (txtFirstName, txtLastName, txtGrade). У меня есть кнопка (btnAddStudent), которая при нажатии должна добавить информацию из текстовых полей в табличную область отображения. Я пытаюсь использовать gridview, но связать его не с чем. Не существует идентификатора участника для загрузки пустой записи из таблицы Student (которая является отношением «многие к одному» с таблицей Member). Запись участника - это то, что создает эта форма, и данные ученика будут добавлены в таблицу ученика при нажатии кнопки «Отправить».

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

Может ли это сработать, или мне нужно посмотреть на использование таблицы и динамическое добавление строк текстовых полей?

Вот соответствующий исходный код:

<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 на основе TextBox
'значения и сохранить свои значения на обратной стороне.

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

При вызове BindGrid () в событии Page_Load. (И да, у меня есть ScriptManager)

1 Ответ

0 голосов
/ 21 декабря 2011

Попробуйте использовать

 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()

Привет

...