2

在我的主 .aspx 页面中,我有一个占位符,它在其中动态注册了两种类型的用户控件。

case "1":
   var control = (ControlType)LoadControl("~/PathToControl.ascx");
   control.Property = value;
   control.Initialize();
   placeholder.controls.add(control);
break;
case "2":
   var control1 = (ControlType)LoadControl("~/PathToControl1.ascx");
   control1.Property = value;
   control1.Initialize();
   placeholder.controls.add(control1);
break;

每个控件都有一些用户控件。

现在,在主页中,我有一个提交按钮,我想从上面的自定义控件中获取每个用户 coltrol 的值。我试图获取占位符的控件,但回发后的占位符为空。

if(placeholder.Controls.count>0){
  var userControl = ((UserControlType)placeholder.Controls[0]);
  var controlName = userControl.FindControl("ControlName") as TextBox;
}

我还尝试在 page_init 上构建自定义控件,但我仍然无法获取用户控件。

有谁知道我怎样才能做到这一点?

解决方案

每次访问都必须在 Init Event 中设置动态用户控件。

有关详细信息http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic4

4

2 回答 2

3

由于用户将单击提交按钮,因此值将与表单一起发布。这是获取值的最简单方法:

  1. 创建动态控件时,设置 ID 属性,例如:

    control1.ID = "control1";

  2. 在回发时,从表单中检索值:

    var control1Value = Request.Form["control1"];

于 2012-05-24T16:27:51.287 回答
1

控件必须在 Init 事件中注册

protected override void OnInit(EventArgs e) {
   case "1":
        var control = (ControlType)LoadControl("~/PathToControl.ascx");
        control.ID = "controlID";
        placeholder.controls.add(control);
  break;
  case "2":
      var control1 = (ControlType)LoadControl("~/PathToControl1.ascx");
      control.ID = "controlID_1";
      placeholder.controls.add(control1);
   break;
base.OnInit(e);
}

在初始化之后设置你想要的任何属性

case "1":
  var control = (ControlType)placeholder.findControl("ControlID");
  control.Property = value;
 control.Initialize();
break;
case "2":
 var control1 = (ControlType)placeholder.findControl("ControlID_1");
 control1.Property = value;
 control1.Initialize();
break;

页面回帖后

void LoadControls(){
   case "1":
    var control = (ControlType)placeholder.findControl("ControlID");
    var txtControl =  control.FindControl("controlName") as TextBox;
   break;
   case "2":
    var control1 = (ControlType)placeholder.findControl("ControlID_1");
    var txtControl_1 =  control1.FindControl("controlName") as TextBox;
   break;
 }
于 2012-05-25T08:15:57.470 回答