如何从 asp.net c# 中动态生成的控件获取值

本文关键字:控件 获取 动态 asp net | 更新日期: 2023-09-27 18:30:49

我知道这是一个很好问的问题,我找到了一些标记为答案,但这些并不能解决我的问题。请看一下我的代码。

显示动态控件的方法

private void ShowControlsByFormId()
            {
                List<FormControlsBO> list = new List<FormControlsBO>();
                list = new FormControlsDA().FormControls_GetByFormId(Convert.ToInt32(ddlForm.SelectedValue.ToString()));
                if (list.Count > 0)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        DynamicControl dynamicControl = CommonUtility.GenerateControl(list[i]);
                        pnlInput.Controls.Add(new LiteralControl("<tr><td>"));
                        pnlInput.Controls.Add(dynamicControl.GeneratedControlLiteral);
                        pnlInput.Controls.Add(new LiteralControl("</td><td></td><td>"));
                        pnlInput.Controls.Add(dynamicControl.GeneratedControl);
                        pnlInput.Controls.Add(new LiteralControl("</td><tr><br/><br/>"));
                    }
                    pnlAction.Visible = true;
                }
                else
                {
                    pnlAction.Visible = false;
                }
            }

生成动态控件的方法

public static DynamicControl GenerateControl(FormControlsBO bo)
        {
            DynamicControl dynamicControl = new DynamicControl();
            Control control = new Control();
            LiteralControl literal = new LiteralControl();
            switch (bo.FieldType)
            {
                case "TextBox":
                    control = new TextBox();
                    control.ID = bo.FieldName;
                    literal.Text = bo.FieldLabel;
                    break;
                case "RadioButton":
                    control = new RadioButton();
                    control.ID = bo.FieldName;
                    literal.Text = bo.FieldLabel;
                    break;
                case "CheckBox":
                    control = new CheckBox();
                    control.ID = bo.FieldName;
                    literal.Text = bo.FieldLabel;
                    break;
                case "DropDownList":
                    control = new DropDownList();
                    control.ID = bo.FieldName;
                    literal.Text = bo.FieldLabel;
                    break;
            }
            control.ClientIDMode = ClientIDMode.Static;
            dynamicControl.GeneratedControl = control;
            dynamicControl.GeneratedControlLiteral = literal;
            return dynamicControl;
        }

保存数据的方法

    private void FormRecords_Save()
            {
                List<FormControlsBO> list = new List<FormControlsBO>();
                FormControlsBO bo = new FormControlsBO();
                foreach (Control ctl in pnlInput.Controls)
                {
                    CommonUtility.DataFiller(bo, ctl);
                    list.Add(bo);
                }
                Boolean result = false;
                result = new FormControlsDA().FormRecords_Save(list);
                if(result == true)
                {
                    lblMessage.Text = "Form data saved successfully";
                }
                else
                {
                    lblMessage.Text = "Form data not saved";
                }
            }

问题是,当我调试代码时,pnlInput.Controls显示零计数。请帮忙!!

如何从 asp.net c# 中动态生成的控件获取值

正如我在这里已经回答的那样,所有动态控件都应该在 Page 的 Init 事件中重新启动,因为视图状态管理器值是在每个请求中设置的。您可以检查页面的生命周期。 因此,现在,当您不在 init 事件中创建控件时,视图状态会在设置回发数据时错过它们,当您尝试获取值时,它们等于零。 请记住,您必须创建具有相同名称的相同控件类型。

如果您已经编写了生成动态控件的代码,并且它位于页面加载事件中,请使用 FindControl("IdofControl"); 来检索其值;

例如

TextBox txtInstance = (TextBox)FindControl("IdofControl");
string txtvalueinTextBox =txtInstance.Text;

确保控件在所有页面重新加载中动态生成。如果在回发时生成的控件不同,则视图状态可能无法正确还原。