locked
Can't edit a gridview inside repeater-getting null reference error RRS feed

  • Question

  • User646364117 posted

    gvContent is inside a repeater. Getting null reference error in 1st line

        Protected Sub gvContent_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)
    
            Dim row As GridViewRow = gvContent.Rows(e.RowIndex)
    <asp:Repeater ID="rptBlock" runat="server">
                    <ItemTemplate>
    
                        <asp:Label ID="Label1" runat="server" Text="Block: " Style="font-weight: bold; color: black; background-color: #5DBCD2;" />
                        <asp:Label ID="lblBlock" runat="server" Text='<%# Eval("name") %>' Style="font-weight: bold; color: black; background-color: #5DBCD2; padding-left: 3px; padding-right: 3px;" />
                        <asp:Literal ID="Literal2" runat="server"> is assigned to these templates: </asp:Literal>
                        <asp:HiddenField ID="hfBlockID" runat="server" Value='<%# Eval("id") %>'></asp:HiddenField>
                        <asp:HiddenField ID="hfBlockType" runat="server" Value='<%# Eval("blocktype") %>'></asp:HiddenField>
                        <asp:TextBox ID="txtTemplateList" runat="server" Text='<%# Eval("TemplateList") %>' Visible="True" Style="font-weight: bold;" TextMode="MultiLine" />
                        <asp:ImageButton ID="btnAssignTemplates" runat="server" src="images/addnew_21.png" CommandName="AssignTemplates" />
    
    
                        <asp:Panel ID="Panel1" runat="server">
                            <h3>Assign Block To Templates</h3>
                            <asp:ListBox ID="lstTemplate" Width="250" SelectionMode="Multiple" runat="server"></asp:ListBox>
                            <asp:HiddenField ID="txtTemplateIDList" runat="server" Value='<%# Eval("templateidList") %>'></asp:HiddenField>
                            <asp:HiddenField ID="blockID" runat="server" Value='<%# Eval("id") %>'></asp:HiddenField>
                            <asp:ImageButton ID="btnSaveAssignedTemplates" runat="server" src="images/save_20.png" CommandName="SaveTemplates" />
                            <asp:ImageButton ID="btnCancelAssignTemplates" runat="server" src="images/cancel_20.png" CommandName="CancelAssignTemplates" />
                        </asp:Panel>
                        <asp:GridView ID="gvContent"
                            AutoGenerateColumns="false"
                            runat="server"
                            OnRowEditing="gvContent_RowEditing"
                            OnRowUpdating="gvContent_RowUpdating"
                            OnRowCancelingEdit="gvContent_RowCancelingEdit"
                            OnRowDataBound="gvContent_OnRowDataBound">
    
    
                            <Columns>
                                <asp:TemplateField HeaderText="Short Text" Visible="false">
                                    <ItemTemplate >
                                        <asp:TextBox ID="txt_id" runat="server" Value='<%#Eval("id") %>'></asp:TextBox>
                                    </ItemTemplate>
    
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Short Text">
                                    <ItemTemplate >
                                        <asp:Label ID="lbl_shorttext" runat="server" Text='<%#Eval("shorttext") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txt_shorttext" runat="server" Text='<%#Eval("shorttext") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Long Text">
                                    <ItemTemplate>
                                        <asp:Label ID="lbl_longtext" runat="server" Text='<%#Eval("longtext") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txt_longtext" runat="server" Text='<%#Eval("longtext") %>' ></asp:TextBox>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:ImageButton ID="btn_Edit" runat="server" CommandName="Edit" src="images/edit_20.png" />
                                   
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:ImageButton ID="btn_Update" runat="server" CommandName="Update" src="images/save_20.png" />
                                      
                                        <asp:ImageButton ID="btn_Cancel" runat="server" CommandName="Cancel" src="images/cancel_20.png" />
                                       
                                    </EditItemTemplate>
                                </asp:TemplateField>
    
                            </Columns>
    
    
    
                        </asp:GridView>
    
                    </ItemTemplate>
                    <SeparatorTemplate>
                        <br />
                        <hr />
                        <br />
                    </SeparatorTemplate>
                </asp:Repeater>

    Sunday, February 9, 2020 7:16 PM

All replies

  • User283571144 posted

    Hi sg48asp,

    Since you nested the grid view control in Repeater, you cannot directly fetch the grid view by calling the ID of it.A feasible way is to cast the sender of the event "gvContent_RowUpdating" to "GridView" because the sender argument is always the control that triggered the event. Here I made an demo based on the code you gave to demostrate how to fetch the GridViewRow.

    .Aspx Page:

    <asp:Repeater ID="rptBlock" runat="server" OnItemDataBound="rptBlock_ItemDataBound">
    
                     <ItemTemplate>
    
                        <asp:Label ID="Label1" runat="server" Text="Block: "/>
                        <asp:Label ID="Label2" runat="server" Text='<% #Container.ItemIndex %>' />
                        <asp:GridView ID="gvContent"
                            AutoGenerateColumns="false"
                            runat="server"
                            OnRowEditing="gvContent_RowEditing"
                            OnRowCancelingEdit="gvContent_RowCancelingEdit"
                            OnRowUpdating="gvContent_RowUpdating"
                            >
                            <Columns>
                                <asp:TemplateField HeaderText="Text ID" Visible="false">
                                    <ItemTemplate >
                                        <asp:TextBox ID="txt_id" runat="server" Value='<%#Eval("id") %>'></asp:TextBox>
                                    </ItemTemplate>
    
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Row Num">
                                    <ItemTemplate >
                                        <asp:Label ID="lbl_rowNum" runat="server" Text='<%#Eval("rowNum") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txt_rowNum" runat="server" Text='<%#Eval("rowNum") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Short Text">
                                    <ItemTemplate >
                                        <asp:Label ID="lbl_shorttext" runat="server" Text='<%#Eval("shorttext") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txt_shorttext" runat="server" Text='<%#Eval("shorttext") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Long Text">
                                    <ItemTemplate>
                                        <asp:Label ID="lbl_longtext" runat="server" Text='<%#Eval("longtext") %>'></asp:Label>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txt_longtext" runat="server" Text='<%#Eval("longtext") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:Button ID="btn_Edit" runat="server" CommandArgument='<%# Container.DataItemIndex %>' CommandName="Edit" Text="Edit"/>
                                   
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:Button ID="btn_Update" runat="server" CommandArgument='<%# Container.DataItemIndex %>' CommandName="Update" Text="Update"/>
                                     
                                        <asp:Button ID="btn_Cancel" runat="server" CommandName="Cancel" Text="Cancel"/>
                                       
                                    </EditItemTemplate>
                                </asp:TemplateField>
    
                            </Columns>
                        </asp:GridView>
    
                    </ItemTemplate>
                    <SeparatorTemplate>
                        <br />
                        <hr />
                        <br />
                    </SeparatorTemplate>
                </asp:Repeater>

    Code-behind:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not IsPostBack Then
                BindRepeater()
            End If
        End Sub
    
        Private Sub BindRepeater()
            Dim dt As DataTable = New DataTable()
            dt.Columns.Add("rowNum", GetType(Integer))
    
            For i As Integer = 0 To 3 - 1
                dt.Rows.Add(i)
            Next
    
            rptBlock.DataSource = dt
            rptBlock.DataBind()
        End Sub
    
        Private Sub BindGridViewByRowNum(ByVal rowNum As Integer, ByVal gd As GridView)
            Dim dt As DataTable = New DataTable()
            dt.Columns.Add("id", GetType(Integer))
            dt.Columns.Add("rowNum", GetType(Integer))
            dt.Columns.Add("shorttext", GetType(String))
            dt.Columns.Add("longtext", GetType(String))
    
            For i As Integer = 0 To 3 - 1
                dt.Rows.Add(i, rowNum, "shortext-" & i & "(rowNum-" & rowNum & ")", "longtext-" & i & "(rowNum-" & rowNum & ")")
            Next
    
            gd.DataSource = dt
            gd.DataBind()
        End Sub
    
        Protected Sub rptBlock_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
            If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
                Dim gd As GridView = CType(e.Item.FindControl("gvContent"), GridView)
                Dim lbl As Label = CType(e.Item.FindControl("Label2"), Label)
                Dim rowNum As Integer = Convert.ToInt32(lbl.Text)
                BindGridViewByRowNum(rowNum, gd)
            End If
        End Sub
    
        Protected Sub gvContent_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs)
            Dim gd As GridView = CType(sender, GridView)
            gd.EditIndex = e.NewEditIndex
            Dim row As GridViewRow = gd.Rows(e.NewEditIndex)
            Dim rowNum As Integer = Convert.ToInt32((CType(row.FindControl("lbl_rowNum"), Label)).Text)
            BindGridViewByRowNum(rowNum, gd)
        End Sub
    
        Protected Sub gvContent_RowCancelingEdit(ByVal sender As Object, ByVal e As GridViewCancelEditEventArgs)
            Dim gd As GridView = CType(sender, GridView)
            gd.EditIndex = -1
            BindRepeater()
        End Sub
    
        Protected Sub gvContent_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs)
            Dim gd As GridView = CType(sender, GridView)
            Dim row As GridViewRow = gd.Rows(e.RowIndex)
            Dim rowNum As String = (CType(row.FindControl("txt_rowNum"), TextBox)).Text
            Dim shorttext As String = (CType(row.FindControl("txt_shorttext"), TextBox)).Text
            Dim longtext As String = (CType(row.FindControl("txt_longtext"), TextBox)).Text
            Page.ClientScript.RegisterClientScriptBlock([GetType](), "js", "<script>alert('you have select row: rowNum = " & rowNum & ", shorttext = " & shorttext & ", longtext = " & longtext & "');</script>")
            gd.EditIndex = -1
            BindRepeater()
        End Sub

    Result:

    Best Regards,

    Brando

    Monday, February 10, 2020 9:19 AM