GridView中的用户控件

时间:2013-12-17 17:02:54

标签: asp.net vb.net gridview data-binding user-controls

我正试图重新审视这个,因为我似乎无法找到答案。我创建了一个用户控件,当我在Parent_ID中进行硬编码时,它非常有效。但是,我想根据GridView行中的值动态分配Parent_ID。

以下是用户控件的CodeBehind:

Public Class Comments
Inherits System.Web.UI.UserControl
Public _name As String
<System.ComponentModel.Bindable(True), System.ComponentModel.Browsable(True)> _
Public Property Parent_ID() As String
    Get
        Return _name
    End Get
    Set(value As String)
        _name = value
    End Set
End Property

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        If Parent_ID Is Nothing Then Parent_ID = "-1"

        DataSource_Comments.FilterParameters(0).DefaultValue = Parent_ID
        'lbl_Parent_Alert.Text = "Parent_ID: " & Parent_ID
    End If
End Sub   
End Class

ASP.net aspx页面:

    <%@ Page Title="About Us" Language="vb" MasterPageFile="~/Site.Master" AutoEventWireup="false"
        CodeBehind="About.aspx.vb" Inherits="MOO.About" %>
    <%@ Register TagPrefix="uc" TagName="Comments_Control"  Src="~/Comments.ascx" %>

    <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    </asp:Content>
    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

        <asp:SqlDataSource ID="DataSource_Missed_Yesterday" runat="server" 
            ConnectionString="<%$ ConnectionStrings:MainMOOConnectionString %>" 
            SelectCommand="SELECT * FROM func_Missed_Yesterday() Order By Total_Price DESC"
            >
        </asp:SqlDataSource>

        <asp:GridView ID="GV_Missed_Yesterday" runat="server" DataSourceID="DataSource_Missed_Yesterday" 
            AutoGenerateColumns="false" CssClass="Grid_View">
           <Columns>
                <asp:BoundField DataField="num_Order_Num" HeaderText="Order Number"/>
                <asp:BoundField DataField="mem_Order_Notes" HeaderText="Order Notes"/>
                <asp:TemplateField HeaderText="Order Notes">
                    <ItemTemplate>
                        <asp:Label ID ='lbl' runat="server" text='<%#Eval("num_Order_Num") %>'/>
                        <uc:Comments_Control id="Comments_Control_ID" runat="server" Parent_ID='<%#Eval("num_Order_Num") %>' />
                    </ItemTemplate>
                </asp:TemplateField> 

            </Columns>
        </asp:GridView>

    </asp:Content>

Aspx.vb页面:

Imports System.Data
Public Class About
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub
Sub GV_Missed_Yesterday_DataBound(sender As Object, e As GridViewRowEventArgs) Handles GV_Missed_Yesterday.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Then

    End If

End Sub
End Class

同样,如果我硬编码这一行:

<uc:Comments_Control id="Comments_Control_ID" runat="server" Parent_ID='<%#Eval("num_Order_Num") %>' />  

如:

<uc:Comments_Control id="Comments_Control_ID" runat="server" Parent_ID='1162519' />   

我看到订单1162519的相应注释。当我将其保留为Eval(“num_Order_Num”)时,我什么也得不到。

我提前感谢你指出我正确的方向。

谢谢,
罗布

3 个答案:

答案 0 :(得分:1)

我可能错了,但我相信首先创建模板中的控件(此时您的Page_Load事件处理程序将在用户控件中运行),然后评估任何绑定语言表达式。因此,通过在用户控件的Parent_ID例程中测试Page_Load的值,您过早地捕获它。

尝试使用PreRender事件代替Load事件来测试Parent_ID的值。这将在渲染之前执行,在评估任何绑定表达式之后。

答案 1 :(得分:1)

Yeap ...... Ann L.是对的。首先创建模板中的控件而不是绑定事件。

如果您无法使用PreRender,也可以使用GV_Missed_Y yesterday_DataBound方法。在某些情况下,您必须在预渲染之前执行操作。 因此,您可以在DataBound方法中为控件设置Parent_ID,还可以在执行代码的Comments_Control中创建一个方法:

DataSource_Comments.FilterParameters(0).DefaultValue = Parent_ID

对于同样的问题,大多数时候都有很多可能的解决方案。

我已经编写了这个新解决方案,以满足任何遇到同样问题但无法使用PreRender事件的人。

答案 2 :(得分:0)

您需要在用户控件的页面加载上执行Page.DataBind()。