ListView控件第3次显示错误数据

时间:2010-08-11 15:42:10

标签: asp.net vb.net listview webforms

我有一个ListView,可以在Page_Load期间以及从EditItemTemplate转到ItemTemplate时填充并显示用户的数据(通过VWD 2008中的个人资料系统)。

当我再次进入编辑屏幕时,我的DropDownList和RadioButtonList控件显示相应表格中的第一项而不是正确的配置文件值。

我不明白为什么控件第一次和第二次正确填充但第三次不正确填充(这是正确的,第三次不是魅力)。

有人可以帮我理解如何解决这个问题吗?

的ItemTemplate:

<asp:DropDownList ID="ddlTState" AppendDataBoundItems="True" 
DataSourceID="srcState" DataTextField="StateName" DataValueField="StateName" 
Enabled="False" TabIndex="125"  runat="server" />

EditItemTemplate中:

<asp:DropDownList ID="ddlEState" AppendDataBoundItems="true" 
                  DataSourceID="srcState" DataTextField="StateName" 
                  DataValueField="StateName" TabIndex="125" runat="server">    
<asp:ListItem Text="--State--" Value="" />

VB代码

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load  
    lsv = Util.FindChild(Me, "lsvProfile")  

    'If Not IsPostBack Then  
    ddl = Util.FindChild(lsv, "ddlEState") 'Util.FindChild = my version of FindControl  
    If ddl IsNot Nothing Then ddl.SelectedValue = Profile.State  

    ddl = Util.FindChild(lsv, "ddlTState")  

    If ddl IsNot Nothing Then ddl.SelectedValue = Profile.State  
    'End If  
End Sub

2 个答案:

答案 0 :(得分:0)

它可能是在达到空状态而不是写作;处理项目/编辑模板的更好方法是使用ItemDataBound事件或ItemCreated事件处理程序。这个功能在它创建行时,您将在那里取得更好的成功。我相信你也可以利用ItemEditing,当一行切换到编辑模式时会激活它,作为处理编辑操作的另一种方式。

编辑:尝试这样做:

protected void lsvProfile_ItemDataBound(..)
{
    if (e.Item.ItemTYpe == ListViewItemType.DataItem)
    {
        DropDownList d = e.Item.FindControl("ddlTState") as DropDownList;
    }

}

并调试以查看它是否为null。应该为null的唯一时间是,如果它呈现页眉/页脚或编辑项......那应该有效,我会一直这样做。

HTH。

答案 1 :(得分:0)

谢谢,Brian。在我阅读你的最新帖子之前,我用这段代码解决了这个问题:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    lsv = Util.FindChild(Page, "lsvProfile")
    If Not IsPostBack Then
        Try
            lsv.EditIndex = 0
            rbl = Util.FindChild(lsv, "rblEGender")
            If rbl IsNot Nothing Then rbl.SelectedValue = Profile.Gender
            ddl = Util.FindChild(lsv, "ddlEState")
            If ddl IsNot Nothing Then ddl.SelectedValue = Profile.State
            ddl = Util.FindChild(lsv, "ddlEBirthDay")
            If ddl IsNot Nothing Then ddl.SelectedValue = Profile.BirthDay
            ddl = Util.FindChild(lsv, "ddlEBirthMo")
            If ddl IsNot Nothing Then ddl.SelectedValue = Profile.BirthMo
        Catch ex As Exception
        End Try
    End If
End Sub

Protected Sub lsvProfile_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles lsvProfile.ItemDataBound
    ddl = Util.FindChild(Me, "ddlEState")
    If ddl IsNot Nothing Then ddl.SelectedValue = Profile.State
    ddl = Util.FindChild(Me, "ddlEBirthMo")
    If ddl IsNot Nothing Then ddl.SelectedValue = Profile.BirthMo
    ddl = Util.FindChild(Me, "ddlEBirthDay")
    If ddl IsNot Nothing Then ddl.SelectedValue = Profile.BirthDay
    rbl = Util.FindChild(Me, "rblEGender")
    If rbl IsNot Nothing Then rbl.SelectedValue = Profile.Gender

End Sub