Asked by:
Can't edit a gridview inside repeater-getting null reference error

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