Asp.net 如何向数据绑定的gridview添加新行?

Asp.net 如何向数据绑定的gridview添加新行?,asp.net,vb.net,gridview,Asp.net,Vb.net,Gridview,每当用户单击AddRow按钮时,我都会尝试向gridview添加一个新的空行。理想情况下,无论单击哪个行,都会在该行的正下方插入一个新行。 我已经阅读了前面的很多问题,但我仍然无法让我的gridview显示新的空行 页面代码: <table> ... ... <td colspan="3" align="left" style="border: thin solid #000000; vertical-align: top; background-color:

每当用户单击AddRow按钮时,我都会尝试向gridview添加一个新的空行。理想情况下,无论单击哪个行,都会在该行的正下方插入一个新行。 我已经阅读了前面的很多问题,但我仍然无法让我的gridview显示新的空行

页面代码:

<table>
    ...
    ...
<td colspan="3" align="left" style="border: thin solid #000000; vertical-align: top; background-color: #4B6C9E">
   <asp:UpdatePanel ID="UpdatePanel1" runat="server" >
     <ContentTemplate>
        <asp:GridView ID="grdHours" runat="server" AutoGenerateColumns="False" Width="100%" CellPadding="4" 
   ForeColor="#333333" GridLines="None" >
    <AlternatingRowStyle BackColor="White" VerticalAlign="Top" Height="20px"/>
                        <Columns>
                            <asp:TemplateField ShowHeader="False" HeaderText="Task">
                                <ItemTemplate>                                                
                                    <asp:Label ID="BufferLabel" runat="server" Text="" Visible="False"></asp:Label>
                                    <asp:TextBox ID="TaskList" runat="server" CssClass="myDropDownSearch" Width="80%"
                                        onfocus="inputFocus(this)" onblur="inputBlur(this)" value="Select a Task..."></asp:TextBox>    
                                    <asp:AutoCompleteExtender ServiceMethod="SearchEmployees" 
                                        MinimumPrefixLength="3"
                                        CompletionInterval="100" EnableCaching="false" CompletionSetCount="10"
                                        TargetControlID="TaskList" 
                                        ID="AutoCompleteExtender3" runat="server" FirstRowSelected = "false">
                                    </asp:AutoCompleteExtender>
                                </ItemTemplate> 
                                <ItemStyle Width="15%" />
                            </asp:TemplateField> 
                            <asp:BoundField DataField="Weekday" HeaderText="Weekday" >
                                <HeaderStyle HorizontalAlign="Left" />
                                <ItemStyle HorizontalAlign="Left" Width="4%" />
                            </asp:BoundField>
                            <asp:BoundField DataField="Date" DataFormatString="{0:d}" HeaderText="Date" >
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle HorizontalAlign="Center" Width="8%" />
                            </asp:BoundField>
                            <asp:TemplateField HeaderText="Hours">
                                <ItemTemplate>
                                    <asp:Label ID="lblHours" Visible='<%# NOT IsInEditMode %>' runat="server" Text='<%# Eval("Hours") %>' CssClass="hoursLabel" />
                                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("Hours") %>' 
                                        Width="90%" Visible='<%# IsInEditMode %>'>
                                    </asp:TextBox>
                                </ItemTemplate>
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Width="5%" HorizontalAlign="Center" />
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Minutes">
                                <ItemTemplate>
                                    <asp:Label ID="lblMins" Visible='<%# NOT IsInEditMode %>' runat="server" Text='<%# Eval("Minutes") %>' CssClass="hoursLabel" />
                                    <asp:DropDownList ID="DropDownList2" runat="server" CssClass="myDropDown" selectedValue='<%# Eval("Minutes") %>'  Visible='<%# IsInEditMode %>' >
                                        <asp:ListItem></asp:ListItem>
                                        <asp:ListItem>0</asp:ListItem>
                                        <asp:ListItem>15</asp:ListItem>
                                        <asp:ListItem>30</asp:ListItem>
                                        <asp:ListItem>45</asp:ListItem>
                                    </asp:DropDownList>
                                </ItemTemplate>
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Width="5%" HorizontalAlign="Center" />
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Activity" >
                                <ItemTemplate>
                                    <asp:Label ID="lblActivity" Visible='<%# NOT IsInEditMode %>' runat="server" Text='<%# Eval("Activity") %>' CssClass="hoursLabel" />
                                    <asp:DropDownList ID="DropDownList1" runat="server" width="75%" selectedValue='<%# Eval("Activity") %>' Visible='<%# IsInEditMode %>'>
                                        <asp:ListItem Selected="True">Select Activity</asp:ListItem>  
                                        <asp:ListItem></asp:ListItem>
                                        <asp:ListItem>Prescope</asp:ListItem>
                                        <asp:ListItem>Scope</asp:ListItem>
                                        <asp:ListItem>Design/Build Configuration</asp:ListItem>
                                        <asp:ListItem>Testing</asp:ListItem>
                                        <asp:ListItem>Training</asp:ListItem>
                                        <asp:ListItem>Implementation/Validation</asp:ListItem>
                                        <asp:ListItem>Maintenance & Ongoing Support</asp:ListItem>                    
                                        <asp:ListItem>Project Management</asp:ListItem>
                                        <asp:ListItem>Shared Time</asp:ListItem>                
                                   </asp:DropDownList>
                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="*" visible="false" ControlToValidate="DropDownList1"></asp:RequiredFieldValidator>
                                </ItemTemplate>
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle Width="20%" HorizontalAlign="Center" />
                            </asp:TemplateField>
                            <asp:TemplateField ShowHeader="False" HeaderText="AddEntries">
                                <ItemTemplate>
                                    <asp:Button ID="btnHoursRow" runat="server" Text="+" Visible='<%# IsInEditMode %>' OnClick="btnNewEntryRow_Click" />
                                </ItemTemplate>
                                <ItemStyle Width="5%" />
                            </asp:TemplateField>
                            <asp:TemplateField ShowHeader="False" HeaderText="AddNotes">
                                <ItemTemplate>
                                    <asp:Label ID="lblNotes" Visible='<%# NOT IsInEditMode %>' runat="server"  CssClass="hoursLabel" />
                                    <asp:Button ID="btnAddNotes" runat="server" Text="Add Notes" Visible='<%# IsInEditMode %>' />
                                    <asp:ModalPopupExtender ID="btnAddNotes_ModalPopupExtender" runat="server" 
                                        DynamicServicePath="" Enabled="True" PopupControlID="pnlNotes" 
                                        TargetControlID="btnAddNotes" 
                                        OkControlID="btnNotesDone">
                                    </asp:ModalPopupExtender>
                                </ItemTemplate>
                                <ItemStyle Width="5%" />
                            </asp:TemplateField>
                            <asp:TemplateField ShowHeader="False"  HeaderText="Validator">
                                <ItemTemplate>            
                                        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Whole Numbers Only" ControlToValidate="TextBox1" ValidationGroup="HoursasIntegers"
                                            ValidationExpression="\d+" SetFocusOnError="False" Width="75%" Font-Bold="True" ForeColor="Red" Display="Dynamic"></asp:RegularExpressionValidator>                                 
                                </ItemTemplate> 
                                <ItemStyle Width="10%" />
                            </asp:TemplateField> 
                            <asp:TemplateField ShowHeader="False" HeaderText="ErrMessage">
                                <ItemTemplate>                                                
                                    <asp:Label ID="ActivityErrorMessage" runat="server" Text="You must select an Activity for entered hours." Visible="False" ForeColor="#FF0000" Font-Bold="True"></asp:Label>
                                </ItemTemplate> 
                                <ItemStyle Width="19%" />
                            </asp:TemplateField> 
                            <asp:TemplateField  HeaderText="TimeNotes">
                                <ItemTemplate>
                                    <asp:Panel ID="pnlNotes" runat="server" Visible='<%# IsInEditMode %>' Width="75%" BackColor="#4B6C9E" Height="300px">
                                        <table width="100%">
                                            <tr>
                                                <td>
                                                    <asp:Label ID="Label1" runat="server" Text="Enter Notes Below:" ForeColor="White" Font-Size="Medium"></asp:Label>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td align="center">
                                                    <asp:TextBox ID="txtNotes" runat="server" CssClass="myTextbox"
                                                        TextMode="MultiLine"  Text='<%# Eval("TimeNotes") %>' Height="200"></asp:TextBox>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td>
                                                    <asp:Button ID="btnNotesDone" runat="server" Text="Done" />
                                                    <asp:Button ID="btnNotesCancel" runat="server" Text="Cancel" OnClick="btnNotesCancel_Click"  Visible="False" />
                                                </td>
                                            </tr>
                                        </table>
                                    </asp:Panel>
                                </ItemTemplate>
                                <ItemStyle Width="4%" />
                            </asp:TemplateField>
                        </Columns>
                        <EditRowStyle BackColor="#2461BF" />
                        <FooterStyle BackColor="White" Font-Bold="True" ForeColor="White" />
                        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                        <RowStyle BackColor="#EFF3FB" Height="20px" VerticalAlign="Top" />
                        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                        <SortedAscendingCellStyle BackColor="#F5F7FB" />
                        <SortedAscendingHeaderStyle BackColor="#6D95E1" />
                        <SortedDescendingCellStyle BackColor="#E9EBEF" />
                        <SortedDescendingHeaderStyle BackColor="#4870BE" />
                    </asp:GridView>
                    </ContentTemplate>
                    </asp:UpdatePanel>
                 </td>
当我单击该按钮时,正在调用BtnewEntryRow_click函数,该函数依次成功调用BindGrdHours(),但在完成后,什么也没有发生。屏幕仍然包含原始的gridview


你知道我哪里出错了吗?感谢您的关注。

网格只是您数据的“表面”。考虑一下,您不应该将行添加到网格中,而是添加到
数据源中,网格应该反映数据的新状态。现在。我认为这种逻辑是有缺陷的。为什么要将空行添加到网格或源?将数据输入控件,然后单击添加。不要添加空行。感谢您的反馈。我开始以您提到的方式思考,将信息添加到后端。只是为了给我正在尝试做的事情提供更多的实质性内容:我有一个gridview,它最初显示所选一周中7天的一行。这允许用户每天输入一项活动。有时,用户希望为某一天输入另一条记录,以指示该天的多项活动。请不要重新发明自行车。你所拥有的是主要的细节。Master是您的网格,detail-应该是一组显示选定行信息的控件。您的网格可能显示10个数据字段,但您的详细信息可能有20个。如果添加新行,请单击“新建”,在某些文本框中输入数据,然后单击“保存”。所有软件都是这样工作的。即使是我键入此评论的表单-我单击了“添加评论”,我键入了此评论,现在我将单击按钮保存此评论
    Protected Sub btnNewEntryRow_Click(ByVal sender As Object, ByVal e As EventArgs)

            '    Dim clickedRow = TryCast(DirectCast(sender, Button).NamingContainer, GridViewRow)
            '    Dim clickedIndex = clickedRow.RowIndex

        'Just hard coded a value for now
            BindGrdHours(3)

    End Sub

  Private Sub BindGrdHours(ByVal rowIndex As Integer)

        Dim rowIndex As Integer = 0

        If ViewState("CurrentGridTable") IsNot Nothing Then

            Dim dtCurrentTable As DataTable = DirectCast(ViewState("CurrentGridTable"), DataTable)
            Dim drCurrentRow As DataRow = Nothing

            If dtCurrentTable.Rows.Count > 0 Then
                For i As Integer = 1 To dtCurrentTable.Rows.Count

                    Dim TaskList As TextBox = DirectCast(grdHours.Rows(rowIndex).Cells(1).FindControl("TaskList"), TextBox)
                    'Dim TextBoxAge As BoundField
                    'TextBoxAge.DataField = grdHours.Rows(rowcount).Cells(2).FindControl("Weekday").ToString
                    'Dim TextBoxAddress As BoundField
                    'TextBoxAddress.DataField = grdHours.Rows(rowcount).Cells(3).FindControl("Date").ToString
                    Dim Hours As TextBox = DirectCast(grdHours.Rows(rowIndex).Cells(4).FindControl("TextBox1"), TextBox)
                    Dim Minutes As DropDownList = DirectCast(grdHours.Rows(rowIndex).Cells(5).FindControl("DropDownList2"), DropDownList)
                    Dim Activity As DropDownList = DirectCast(grdHours.Rows(rowIndex).Cells(6).FindControl("DropDownList1"), DropDownList)
                    Dim AddEntries As Button = DirectCast(grdHours.Rows(rowIndex).Cells(7).FindControl("btnHoursRow"), Button)
                    drCurrentRow = dtCurrentTable.NewRow()
                    ' drCurrentRow("RowNumber") = i + 1

                    dtCurrentTable.Rows(i - 1)("Task") = TaskList.Text.ToString
                    dtCurrentTable.Rows(i - 1)("Weekday") = grdHours.Rows(rowIndex).Cells(2).Text.ToString
                    dtCurrentTable.Rows(i - 1)("Date") = grdHours.Rows(rowIndex).Cells(3).Text.ToString
                    dtCurrentTable.Rows(i - 1)("Hours") = Hours.Text.ToString
                    dtCurrentTable.Rows(i - 1)("Minutes") = Minutes.SelectedValue.ToString
                    dtCurrentTable.Rows(i - 1)("Activity") = Activity.SelectedValue.ToString
                    dtCurrentTable.Rows(i - 1)("AddEntries") = AddEntries.Text.ToString
                    dtCurrentTable.Rows(i - 1)("AddNotes") = String.Empty
                    dtCurrentTable.Rows(i - 1)("Validator") = String.Empty
                    dtCurrentTable.Rows(i - 1)("ErrMessage") = String.Empty
                    dtCurrentTable.Rows(i - 1)("TimeNotes") = String.Empty
                    rowIndex += 1
                Next

                dtCurrentTable.Rows.Add(drCurrentRow)
                ViewState("CurrentGridTable") = dtCurrentTable

                grdHours.DataSource = dtCurrentTable
                grdHours.DataBind()

                Dim txn As TextBox = DirectCast(grdHours.Rows(rowIndex).Cells(1).FindControl("TextBox1"), TextBox)
                ' txn.Focus;
                txn.Focus()

            End If

        End If

        enterHours(True)

    End Sub