我正试图重新审视这个,因为我似乎无法找到答案。我创建了一个用户控件,当我在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”)时,我什么也得不到。
我提前感谢你指出我正确的方向。
谢谢,
罗布
答案 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()。