在回发上加载用户控件并根据父页面文本框值 c# 加载数据

Load usercontrol on postback and load data based on parent page textbox value c#

这可能真的很简单,但我似乎根本无法从父页面获取我的值?

Aspx 页面在母版页内,ContentP 以代码为例

<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:TextBox ID="tbFromDate" runat="server" ></asp:TextBox>

    <asp:Button ID="butDisplayInfo" runat="server" Text="Display info" OnClick="butDisplayInfo_Click"
        CssClass="button-gray" />
    <asp:PlaceHolder ID="placeHolderContent" runat="server">              
   </asp:PlaceHolder>

我想要的是当按下按钮时加载 UserControl 并根据文本框中输入的日期加载数据,然后我可以使用它来将数据加载到控件?

.aspx.cs

protected void butDisplayInfo_Click(object sender, EventArgs e)
{
    var ctrl = LoadControl("~/Controls/DailyShiftStats.ascx");
    ctrl.ID = "ucUserCtrl1";

    placeHolderContent.Controls.Add(ctrl);
}

用户控件ascx.cs

protected void Page_Load(object sender, EventArgs e)
{
TextBox tb = (TextBox)this.Parent.Page.FindControl("ContentPlaceHolder1").FindControl("tbFromDate");
            Response.Write(tb.Text); 
}

public void getShiftInfo(DateTime shiftDate)
{
    //load my data
}

根据我的评论 - 你最好在你的控件中定义一个 属性 然后让页面传递它,我已经有一段时间没有这样做了,但基本的想法是 -

尽在您的掌控之中

public DateTime? ShiftDate
{
    set { this.shiftDate = value; }
}
private DateTime? shiftDate;

然后你可以在你的控件中任何需要它的地方使用shiftDate,如果你像上面那样将它设为Nullable,那么你可以检查它是否已被设置,如果没有则抛出错误(或任何合适的)。

在您创建控件时的页面中,您将拥有(注意:您需要将控件转换为正确的类型)

var ctrl = (DailyShiftStats)LoadControl("~/Controls/DailyShiftStats.ascx");
ctrl.ID = "ucUserCtrl1";

//TODO: Handle an invalid date
DateTime shiftDate;
if (DateTime.TryParse(tbFromDate.Text, out shiftDate))
{
    ctrl.ShiftDate = shiftDate;
}

placeHolderContent.Controls.Add(ctrl);