我有一个.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”,因为这会导致回发发生,我需要在实际保存表单后从模板中触发其他方法。
答案 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”。在每个领域之前。