Asp.net 数据列表中的用户控件

Asp.net 数据列表中的用户控件,asp.net,vb.net,user-controls,datalist,Asp.net,Vb.net,User Controls,Datalist,我在DataList中有一个UserControl,我根据DataList数据的PrimeryKey填充UserControl中的控件。第一次加载时,程序的行为和预期的一样,但当用户更改页面索引时,所有MessageID都返回0,很可能是随附的值 他迷路了。我不想硬编码usercontrol,因为我在项目的许多地方都使用过它,它使代码可维护。我如何纠正这种行为?提前谢谢 我的代码如下: <asp:DataList ID="DataList1" runat="server"

我在DataList中有一个UserControl,我根据DataList数据的PrimeryKey填充UserControl中的控件。第一次加载时,程序的行为和预期的一样,但当用户更改页面索引时,所有MessageID都返回0,很可能是随附的值 他迷路了。我不想硬编码usercontrol,因为我在项目的许多地方都使用过它,它使代码可维护。我如何纠正这种行为?提前谢谢

我的代码如下:

        <asp:DataList ID="DataList1" runat="server" Width="658px">
            <ItemTemplate>
                <table style="width: 100%;">
                    <tr>
                        <td style="font-weight: 700; color: #FF0000; font-size: medium; font-size: 10pt; font-family: Tahoma">
                            <%# Eval("hadding") +" ["+Eval("startTime")+" - "+Eval("endTime")+"]"%>
                        </td>
                    </tr>
                    <tr>
                        <td style="font-weight: 700; font-size: 10pt; font-family: Tahoma">
                            <%# Eval("location") %>
                        </td>
                    </tr>                        
                    <tr>
                        <td>
                            <uc1:MyUserControl ID="MyUserControl1" runat="server" MessageID='<%# Eval("id").toString()%>' />
                        </td>
                    </tr>
                </table>

            </ItemTemplate>
        </asp:DataList>
        <table>
            <tr>
                <td>
                    <asp:Button ID="btnfirst" runat="server" Font-Bold="true" Text="<<" Height="31px"
                        Width="43px" OnClick="btnfirst_Click" /></td>
                <td>
                    <asp:Button ID="btnprevious" runat="server" Font-Bold="true" Text="<" Height="31px"
                        Width="43px" OnClick="btnprevious_Click" /></td>
                <td>
                    <asp:Button ID="btnnext" runat="server" Font-Bold="true" Text=">" Height="31px"
                        Width="43px" OnClick="btnnext_Click" /></td>
                <td>
                    <asp:Button ID="btnlast" runat="server" Font-Bold="true" Text=">>" Height="31px"
                        Width="43px" OnClick="btnlast_Click" /></td>
            </tr>
        </table>

不查看整个页面生命周期很难回答,但您可以尝试将
MessageId
存储在控件的
ViewState
中,如下所示:

  Public Property MessageID As Integer
    Get
      If (Me.ViewState("VSMessageID") IsNot Nothing) Then
         return CType(Me.ViewState("VSMessageID "), Integer)
      else 
         return 0 // arbitrary value
    End Get

    Set(value As Integer)
       Me.ViewState.Add("VSMessageID", value)
    End Set
  End Property
然后:

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If (MessageID > 0) Then
        Fill(MessageID )
    End If
  End Sub


抱歉,如果VB.Net语法不正确

我通过更改usercontrol解决了此问题,如下所示:

Partial Class MyUserControl
Inherits System.Web.UI.UserControl

Public Property MessageID As Integer
    Get
        Return 0
    End Get
    Set(value As Integer)
        Fill(value)
    End Set
End Property

Protected Sub Fill(messageID As Integer)
    'Some code
End Sub

End Class
正如jbl所说,这是因为页面生命周期。在ASPxDataview的PageIndexChange事件上或在asp.net DataList的自定义PageIndexChange事件上,代码工作如下:

  • 数据列表(或ASPxDataview)加载
  • UserControl属性设置
  • 用户控制负载
  • PageIndexChange事件
  • 用户控制负载
  • UserControl属性设置

  • 这就是为什么没有设置UserControl.Load属性的原因。

    是!这是因为页面生命周期。谢谢你的快速回复。
    Partial Class MyUserControl
    Inherits System.Web.UI.UserControl
    
    Public Property MessageID As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
            Fill(value)
        End Set
    End Property
    
    Protected Sub Fill(messageID As Integer)
        'Some code
    End Sub
    
    End Class