2010-08-11 64 views
1

我有一個ListView,在Page_Load期間以及當我從EditItemTemplateItemTemplate期間填充和顯示用戶數據(通過VWD 2008中的配置文件系統)。ListView控件第三次顯示錯誤的數據

當我再次進入編輯屏幕時,我的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 

回答

0

這可能是它打空條件,不寫;處理項目/編輯模板的更好方法是使用ItemDataBound事件或ItemCreated事件處理程序。這在創建該行時具有特徵,並且您將在此獲得更好的成功。我相信你也可以利用ItemEditing,當行切換到編輯模式時觸發,作爲處理編輯動作的另一種方式。

編輯:試着這樣做:

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

} 

和調試,看看是否爲空或不爲空。唯一應該爲null的時間是,如果它呈現頁眉/頁腳或編輯項目...這應該工作,但我一直這樣做。

HTH。

+0

謝謝Brian,即使你不拼寫你的名字。 (;>)不幸的是,你所建議的事件甚至沒有「注意到」這些控件(除了ListView控件,「lsvProfile」)。然而,它們是在Page_Load的第一輪中被選中的。我傾向於認爲這個問題與ListView的EditIndex有關,但我不知道如何或在哪裏操縱EditIndex來發現它。 – Bryan 2010-08-12 06:40:50

+0

這些列表控件(DDL和RBL)正在成爲一大難題。首先,我被告知,.Net 3.5中的一個錯誤不允許我將它們綁定在聲明性代碼中,除非我想要錯誤;現在,當我嘗試遵循變通方法並從代碼隱藏中填充它們時,我無法做到這一點。這些錯誤是否已在4.0中修復? – Bryan 2010-08-12 06:57:04

+0

您提到的錯誤我認爲實際上是綁定問題,因爲它會在應用數據源之前應用所選值;我以前得到過錯誤。要測試,請在RowDataBound中嘗試上面的代碼;我將編輯帖子。另外,請確保您正在使用該項目查找項目,但不能直接使用listview參考。 – 2010-08-12 12:34:27

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