【问题标题】:Dynamic controls disappear ASP.NET C# (Loading controls depending on a DropDownList selection)动态控件消失 ASP.NET C#(根据 DropDownList 选择加载控件)
【发布时间】:2014-09-21 11:26:58
【问题描述】:

我是 ASP.NET 的新手;我在页面中有一个 DropDownList(带有母版页):

<asp:DropDownList ID="cmbPrueba" runat="server" OnSelectedIndexChanged="cmbPrueba_SelectedIndexChanged" AutoPostBack="true">
    <asp:ListItem Value="0">Compresor de Aire</asp:ListItem>
    <asp:ListItem Value="1">Compresor/Unidad de Refrigeración</asp:ListItem>
</asp:DropDownList>
<asp:Button ID="btnActualizar" runat="server" Text="Actualizar" OnClick="btnActualizar_Click" />
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

placeHolder 根据 DropDownList (cmbPrueba) 使用字符串数组创建控件; (我制作了模拟数据库字符串结果的字符串数组)。

所以,如果我采用itemIndex=0 ("CompresorDeAire) 我将创建:"TextBox"、"Calendar"、"TextBox";

如果我采用 index=1 (CompresorUnidadDeRefrigeracion) 控件是:“DropDownList”、“TextBox”、“Calendar”、“Calendar”、“TextBox”...但是有一个“DropDownList”控件,所以我会填写此信息:

private string[] CompresorUnidadDeRefrigeracionTipoCompresor = new string[] { "Compresor Alternativo", "Compresor de Tornillo", "Unidad de Refrigeración" };

等等。代码如下:

public partial class Controles : System.Web.UI.Page
{
    private Label _Label;
    private TextBox _TextBox = new TextBox();
    private Calendar _Calendar = new Calendar();
    private DropDownList _DropDownList = new DropDownList();

    private string[] CompresorDeAire = new string[] { "TextBox", "Calendar", "TextBox" };
    private string[] CompresorUnidadDeRefrigeracion = new string[] { "DropDownList", "TextBox", "Calendar", "Calendar", "TextBox" };
    private string[] CompresorUnidadDeRefrigeracionTipoCompresor = new string[] { "Compresor Alternativo", "Compresor de Tornillo", "Unidad de Refrigeración" };
    private string[] BombaElectrica = new string[] { "TextBox", "TextBox", "TextBox", "TextBox", "TextBox", "TextBox" };

    protected void Page_Load(object sender, EventArgs e)
    {
       LoadInfo(CompresorDeAire);
    }

    private void LoadInfo(string[] Arreglo)
    {
        for (int i = 0; i < Arreglo.Length; i++)
        {
            _Label = new Label();
            _TextBox = new TextBox();
            _Calendar = new Calendar();
            _DropDownList = new DropDownList();

            _Label.Text = Arreglo[i].ToString() + i.ToString();
            _Label.ID = _Label.Text;
            PlaceHolder1.Controls.Add(_Label);
            PlaceHolder1.Controls.Add(new LiteralControl("<br />"));

            if (Arreglo[i] == _TextBox.GetType().Name.ToString())
            {
                _TextBox.ID = "txt" + _Label.ID;
                //_TextBox.AutoPostBack = true;
                PlaceHolder1.Controls.Add(_TextBox);
            }
            else if (Arreglo[i] == _Calendar.GetType().Name.ToString())
            {
                _Calendar.ID = "cln" + _Label.ID;
                PlaceHolder1.Controls.Add(_Calendar);
            }
            else if (Arreglo[i] == _DropDownList.GetType().Name.ToString())
            {
                _DropDownList.ID = "cmb" + _Label.ID;

                //_DropDownList.AutoPostBack = true;
                foreach (var item in CompresorUnidadDeRefrigeracionTipoCompresor)
                {
                    int j = 0;
                    _DropDownList.Items.Add(item);
                    j++;
                }

                PlaceHolder1.Controls.Add(_DropDownList);
            }

            PlaceHolder1.Controls.Add(new LiteralControl("<br /><br />"));
        }
    }

    protected void cmbPrueba_SelectedIndexChanged(object sender, EventArgs e)
    {
        txtMensaje.Text = "";
        PlaceHolder1.Controls.Clear();

        switch (cmbPrueba.SelectedIndex)
        {
            case 0:
                this.LoadInfo(CompresorDeAire);
                break;

            case 1:
                this.LoadInfo(CompresorUnidadDeRefrigeracion);
                break;

            case 2:
                this.LoadInfo(BombaElectrica);
                break;
        }
    }

    protected void btnActualizar_Click(object sender, EventArgs e)
    {
        txtMensaje.Text = "";

        for (int i = 0; i < PlaceHolder1.Controls.Count; i++)
        {
            switch (PlaceHolder1.Controls[i].GetType().Name.ToString())
            {
                case "TextBox":
                    TextBox TB = PlaceHolder1.FindControl(PlaceHolder1.Controls[i].ID) as TextBox;
                    txtMensaje.Text += PlaceHolder1.Controls[i].GetType().Name + " " + PlaceHolder1.Controls[i].ID + " " + TB.Text + "\n";
                    TB.Text += "*";

                    break;

                case "Calendar":
                    Calendar Cal = PlaceHolder1.FindControl(PlaceHolder1.Controls[i].ID) as Calendar;
                    txtMensaje.Text += PlaceHolder1.Controls[i].GetType().Name + " " + PlaceHolder1.Controls[i].ID + " " + Cal.SelectedDate.ToShortDateString() + "\n";
                    break;

                case "DropDownList":
                    DropDownList DD = PlaceHolder1.FindControl(PlaceHolder1.Controls[i].ID) as DropDownList;

                    txtMensaje.Text += PlaceHolder1.Controls[i].GetType().Name + " " + PlaceHolder1.Controls[i].ID + " " + DD.Text + "\n";
                    break;
            }
        }
    }

    protected void btnLimpiar_Click(object sender, EventArgs e)
    {
        PlaceHolder1.Controls.Clear();
        txtMensaje.Text = "";
    }
}

当我默认运行代码时 Index = 0 ,我使用文本框和日历,然后单击“Actualizar”,当我选择 Index=1 时,我可以在文本框中看到信息(并加载第二个数组) 所有新控件都会显示,但如果我选择日期或在文本框中输入并单击按钮“Actualizar”,页面将返回上一页(数组 1)。

感谢您的帮助!谢谢。

【问题讨论】:

    标签: c# asp.net dynamic placeholder


    【解决方案1】:

    我假设当您说“页面返回到上一页(数组 1)”时。你的意思是第一个数组(在第零个元素中)

    问题是 .NET 不会在回发时自动为您重新创建动态控件。你必须处理它。

    以下是第一个页面请求的基本步骤:

    • 执行 Page_load 事件,该事件为 CompressorDeAir 调用 LoadInfo。

    然后,当您在下拉列表中选择不同的条目,然后单击 Actualizer 按钮时,它会使用以下基本步骤进行回发:

    • 执行 Page_load 事件,该事件为 CompresorDeAir 调用 LoadInfo。

    • 执行 cmbPrueba_SelectedIndexChanged 会丢弃在页面加载中添加的动态控件并加载所选索引的控件。

    • 执行 btnActualizer_Click 事件,显示动态占位符中的控件,这些是所选下拉值的控件。

    然后,当您更改文本或日期,然后单击 Actualizer 按钮时,它会执行以下步骤:

    • 执行 Page_load 事件,该事件为 CompresorDeAir 调用 LoadInfo。

    • 执行 btnActualizer_Click 事件,显示动态占位符中的控件。在这种情况下,将显示来自页面加载的那些。未创建先前选定的下拉列表项中的控件。

    下拉列表中所选项目的控件添加到占位符的唯一时间是当所选项目更改为下拉列表时。

    解决方案是在表单中放置一个隐藏变量,以保存下拉列表中最后选择的项目。每次所选索引更改时,都会更新此隐藏值。在页面加载事件中,在回发时,根据该隐藏值加载适当的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多