【问题标题】:ListView controls display wrong data the 3rd timeListView 控件第三次显示错误数据
【发布时间】:2010-08-11 15:42:09
【问题描述】:

我有一个 ListView,它在 Page_Load 期间以及当我从 EditItemTemplate 转到 ItemTemplate 时填充和显示用户数据(通过 VWD 2008 中的配置文件系统)。

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

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

谁能帮我理解如何解决这个问题?

项目模板:

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

编辑项目模板:

<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

【问题讨论】:

    标签: asp.net vb.net listview webforms


    【解决方案1】:

    可能是它达到了 null 条件而不是写入;处理项目/编辑模板的更好方法是利用 ItemDataBound 事件或 ItemCreated 事件处理程序。此功能在创建行时具有,您将在那里获得更好的成功。我相信您还可以利用 ItemEditing(当行切换到编辑模式时触发)作为处理编辑操作的另一种方式。

    编辑:尝试这样做:

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

    并调试以查看它是否为空。唯一应该为 null 的情况是它呈现页眉/页脚或编辑项...不过应该可以,我一直都这样做。

    HTH。

    【讨论】:

    • 谢谢,布赖恩……即使你的名字拼写不正确。 (;>) 不幸的是,您建议的任何事件都没有“注意到”控件(ListView 控件“lsvProfile”除外)。然而,它们在 Page_Load 的第一轮中被选中。我倾向于认为问题与 ListView 的 EditIndex 有关,但我不确定如何或在何处操作 EditIndex 以找出答案。
    • 这些列表控件(DDLs 和 RBLs)正在变得很痛苦。首先,我被告知 .Net 3.5 中的一个错误不允许我将它们绑定到声明性代码中,除非我想要错误;现在,当我尝试遵循解决方法并从代码隐藏中填充它们时,我做不到。这些错误在 4.0 中修复了吗?
    • 您提到的错误我认为实际上是绑定问题,因为它会在应用数据源之前应用选定的值;我以前遇到过错误。要测试,在 RowDataBound 中,尝试上面的代码;我会编辑帖子。另外,请确保您正在使用该项目来查找项目,您不能直接使用列表视图引用。
    【解决方案2】:

    谢谢,布赖恩。在阅读您的最新帖子之前,我已使用此代码解决了它:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多