Scott.Macmaster
June 27th, 2008, 10:05 AM
I have an 'edit' button in each row created by my repeater. The problem I'm having is none of the controls I have in my ItemTemplate will save their state.
Everything I've read said that controls listed in the template will automatically remember their view state. I can't even seem to get them to remember their state from one function to the next. Does DataBind() somehow wipe their state? Also, on a postback, why does the repeater call Repeater1_ItemCreated() twice for each item?
I've made a really simple test app and it still doesn't work. What do I need to do to get this to work? In this app I'm simply trying to get each row to remember if they are in edit mode.
Thanks,
RepeaterEditModeTest.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="RepeaterEditModeTest.aspx.vb" Inherits="HR_RepeaterEditModeTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td id="rowItemRow" runat="server"></td>
<td>
<asp:LinkButton ID="cmdEdit" CommandName="Edit" runat="server">Edit</asp:LinkButton>
<asp:LinkButton ID="cmdSave" CommandName="Save" runat="server">Save</asp:LinkButton>
<asp:LinkButton ID="cmdCancel" CommandName="Cancel" runat="server">Cancel</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
RepeaterEditModeTest.aspx.vb
Option Explicit On
Option Strict On
Imports System.Collections.Generic
Partial Class HR_RepeaterEditModeTest
Inherits System.Web.UI.Page
Public Data As New SortedList(Of String, Boolean)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Data.Add("ABC", False)
Data.Add("DEF", False)
Data.Add("GHI", False)
Data.Add("JKL", False)
Repeater1.DataSource = Data
Repeater1.DataBind()
End Sub
Protected Sub Repeater1_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemCreated
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim cmdEdit As LinkButton = CType(e.Item.FindControl("cmdEdit"), LinkButton)
Dim cmdSave As LinkButton = CType(e.Item.FindControl("cmdSave"), LinkButton)
Dim cmdCancel As LinkButton = CType(e.Item.FindControl("cmdCancel"), LinkButton)
Dim kvp As KeyValuePair(Of String, Boolean) = CType(e.Item.DataItem, KeyValuePair(Of String, Boolean))
cmdEdit.CommandArgument = kvp.Key
cmdSave.CommandArgument = kvp.Key
cmdCancel.CommandArgument = kvp.Key
' this will only be true for one item and it'll be for the one clicked
Dim editMode As Boolean = kvp.Value
' this will get the other ones that are in edit mode
If cmdEdit.Attributes("EditMode") Is Nothing = False Then
If cmdEdit.Attributes("EditMode") = "Y" Then
editMode = True
End If
End If
' Adjust visibility of edit/save/cancel to reflect mode
If editMode Then
cmdEdit.Visible = False
cmdSave.Visible = True
cmdCancel.Visible = True
Else
cmdEdit.Visible = True
cmdSave.Visible = False
cmdCancel.Visible = False
End If
End If
End Sub
Protected Sub Repeater1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles Repeater1.ItemCommand
Dim cmdEdit As LinkButton = CType(e.Item.FindControl("cmdEdit"), LinkButton)
If e.CommandName = "Edit" Then
Data(CStr(e.CommandArgument)) = True
cmdEdit.Attributes("EditMode") = "Y"
ElseIf e.CommandName = "Save" Then
Data(CStr(e.CommandArgument)) = False
cmdEdit.Attributes("EditMode") = "N"
ElseIf e.CommandName = "Cancel" Then
Data(CStr(e.CommandArgument)) = False
cmdEdit.Attributes("EditMode") = "N"
End If
Repeater1.DataSource = Data
Repeater1.DataBind()
End Sub
End Class
Everything I've read said that controls listed in the template will automatically remember their view state. I can't even seem to get them to remember their state from one function to the next. Does DataBind() somehow wipe their state? Also, on a postback, why does the repeater call Repeater1_ItemCreated() twice for each item?
I've made a really simple test app and it still doesn't work. What do I need to do to get this to work? In this app I'm simply trying to get each row to remember if they are in edit mode.
Thanks,
RepeaterEditModeTest.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="RepeaterEditModeTest.aspx.vb" Inherits="HR_RepeaterEditModeTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td id="rowItemRow" runat="server"></td>
<td>
<asp:LinkButton ID="cmdEdit" CommandName="Edit" runat="server">Edit</asp:LinkButton>
<asp:LinkButton ID="cmdSave" CommandName="Save" runat="server">Save</asp:LinkButton>
<asp:LinkButton ID="cmdCancel" CommandName="Cancel" runat="server">Cancel</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
RepeaterEditModeTest.aspx.vb
Option Explicit On
Option Strict On
Imports System.Collections.Generic
Partial Class HR_RepeaterEditModeTest
Inherits System.Web.UI.Page
Public Data As New SortedList(Of String, Boolean)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Data.Add("ABC", False)
Data.Add("DEF", False)
Data.Add("GHI", False)
Data.Add("JKL", False)
Repeater1.DataSource = Data
Repeater1.DataBind()
End Sub
Protected Sub Repeater1_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemCreated
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim cmdEdit As LinkButton = CType(e.Item.FindControl("cmdEdit"), LinkButton)
Dim cmdSave As LinkButton = CType(e.Item.FindControl("cmdSave"), LinkButton)
Dim cmdCancel As LinkButton = CType(e.Item.FindControl("cmdCancel"), LinkButton)
Dim kvp As KeyValuePair(Of String, Boolean) = CType(e.Item.DataItem, KeyValuePair(Of String, Boolean))
cmdEdit.CommandArgument = kvp.Key
cmdSave.CommandArgument = kvp.Key
cmdCancel.CommandArgument = kvp.Key
' this will only be true for one item and it'll be for the one clicked
Dim editMode As Boolean = kvp.Value
' this will get the other ones that are in edit mode
If cmdEdit.Attributes("EditMode") Is Nothing = False Then
If cmdEdit.Attributes("EditMode") = "Y" Then
editMode = True
End If
End If
' Adjust visibility of edit/save/cancel to reflect mode
If editMode Then
cmdEdit.Visible = False
cmdSave.Visible = True
cmdCancel.Visible = True
Else
cmdEdit.Visible = True
cmdSave.Visible = False
cmdCancel.Visible = False
End If
End If
End Sub
Protected Sub Repeater1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles Repeater1.ItemCommand
Dim cmdEdit As LinkButton = CType(e.Item.FindControl("cmdEdit"), LinkButton)
If e.CommandName = "Edit" Then
Data(CStr(e.CommandArgument)) = True
cmdEdit.Attributes("EditMode") = "Y"
ElseIf e.CommandName = "Save" Then
Data(CStr(e.CommandArgument)) = False
cmdEdit.Attributes("EditMode") = "N"
ElseIf e.CommandName = "Cancel" Then
Data(CStr(e.CommandArgument)) = False
cmdEdit.Attributes("EditMode") = "N"
End If
Repeater1.DataSource = Data
Repeater1.DataBind()
End Sub
End Class