在回发时加载usercontrol并根据父页面文本框值c#加载数据

时间:2015-01-23 12:08:20

标签: c# asp.net controls postback

这可能非常简单,但我似乎无法从父页面中获取我的价值观?

Aspx页面位于主页面内,ContentPwith代码

<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);
}

Usercontrol 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
}

1 个答案:

答案 0 :(得分:1)

根据我的评论 - 您最好在控件中定义一个属性,然后将页面传递给我,我暂时没有这样做,但基本的想法是 -

在你的控制中

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);