C#onclick从控件模板中调用父页面的方法

时间:2018-02-14 04:43:39

标签: c# asp.net

我有一个.ascx页面,它通过占位符加载控件模板。

<div id="TemplatePages" ClientIDMode="Static" runat="server">
    <asp:PlaceHolder ID="repeater" runat="server"/>
</div>

我正在添加一个控件模板(两次相同的模板)

some ctrl = (some)Page.LoadControl(_somePath);
ctrl.Item1 = "Value";
ctrl.Item2 = something.Value;
ctrl.Item3 = someOtherThing.Value;
repeater.Controls.Add(ctrl);

some ctrl2 = (some)Page.LoadControl(_somePath2);
ctrl2.Item1 = "Value";
ctrl2.Item2 = something.Value;
ctrl2.Item3 = someOtherThing.Value;
repeater.Controls.Add(ctrl2);

模板包含一些简单的表单。但是,单击模板中的任何按钮/链接,我想保存控件模板的BOTH实例的值。在加载表单的页面上,我有我的保存按钮,用于保存两个表单的值,但这是在主页面方法上。我想从模板本身中保存两个表单中所有字段的值。

我无法触发主保存按钮的“onclick”,因为这会导致回发发生,我需要在实际保存表单后从模板中触发其他方法。

2 个答案:

答案 0 :(得分:0)

您可以触发主窗体的onclick事件,但在onclick事件中,您需要调用正在使用的用户控件的方法。

如果在您的用户控件中公开的公共方法被称为SaveFormValues( ),那么您应该在主页中使用如下代码。我假设您的主页中有一个ID为plh1的占位符,您将在其中添加用户控件实例,并且用户控件的名称为WebUserControl

注意如何通过将用户控件的id传递给Page.FindControl方法来访问用户控件。找到用户控件后,只需调用公开的SaveFormValues方法。

主页代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
     WebUserControl webControl21 = (WebUserControl)Page.LoadControl("~/WebUserControl.ascx");
    webControl1.ID = "template1";
    WebUserControl webControl22 = (WebUserControl)Page.LoadControl("~/WebUserControl.ascx");
    webControl2.ID = "template2";
    plh1.Controls.Add(webControl1);
    plh1.Controls.Add(webControl2);
}

protected void btnMainFormSave_Click(object sender, EventArgs e)
{
    ((WebUserControl2)Page.FindControl("template1")).SaveFormValues();
    ((WebUserControl2)Page.FindControl("template2")).SaveFormValues();
}

主页标记

     <asp:PlaceHolder ID="plh1" runat="server"></asp:PlaceHolder>
    <asp:Button ID="btnMainFormSave"  runat="server" Text="Save Form Values"
            OnClick="btnMainFormSave_Click"/>

用户控件中公开曝光的方法

public partial class WebUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    public void SaveFormValues()
    {
        //TO DO? Save your user control values
        //lblMessage.Text = "form values have been saved for this template";
    }
}

答案 1 :(得分:0)

我的用户控件保存方法(最初只保存控件的单个实例,修改后如下所示)

public void saveData()
    {
        var phBOM = (PlaceHolder)this.Parent.FindControl("phBOM");
        foreach (UserControl ctrl in phBOM.Controls)
        {
            var type = (ucBOM)ctrl;
            var item = ConstructFormData(type);
        }
    }

然后在我的ConstructFormData中,我只需添加“this”。在每个领域之前。