Генерация динамических элементов управления ASP.NET для нескольких типов элементов управления - PullRequest
2 голосов
/ 06 марта 2012

Я хочу создать динамические поля.Я погуглил несколько примеров и заставил их работать, однако проблема во всех этих примерах заключается в том, что они имеют дело с одним типом элемента управления, в большинстве случаев его TextBox.

Мне нужна возможность создавать и отображать различные элементы UIControl, такие как TextBox, DropDownList, Button и т. Д.

Необязательно: я нашел один пример, который я изменил, и он отображал TextBox и DropDownListдинамически.Однако из-за Type мне пришлось обрабатывать TextBox и DropDownList в отдельных циклах, что привело к созданию пользовательского интерфейса, в котором сначала отображаются все элементы управления TextBox, а затем отображаются все элементы управления DropDownList (так что в основном порядок не сохраняется).

ОБНОВЛЕНИЕ: Добавлен исходный код. Файл .ASPX.CS:

    public partial class DynamicFields : System.Web.UI.Page
{
    static int intControlCountTXB = 0;
    static int intControlCountDDL = 0;
    static int intControlCount = 0;
    private Control[] arrControls;
    private DropDownList[] arrDDL;
    private TextBox[] arrTXB;

    protected void Page_Load(object sender, EventArgs e)
    {

    }![enter image description here][1]

    protected void Page_PreInit(object sender, EventArgs e)
    {
        Control myControl = GetPostBackControl(this.Page);

        if ((myControl != null))
        {
            if ((myControl.ClientID.ToString() == "btnAddTextBox"))
            {
                intControlCountTXB = intControlCountTXB + 1;
                intControlCount++;

            }

            if ((myControl.ClientID.ToString() == "btnAddDDL"))
            {
                intControlCountDDL = intControlCountDDL + 1;
                intControlCount++;
            }
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        int i;
        TextBox txbTarget;
        DropDownList ddlTarget;
        arrDDL = new DropDownList[intControlCountDDL];
        arrTXB = new TextBox[intControlCountTXB];


        for (i = 0; i < intControlCountDDL; i += 1)
        {
            ddlTarget = new DropDownList();
            ddlTarget.ID = "DDL" + i.ToString();

            ddlTarget.Items.Add("A");
            ddlTarget.Items.Add("B");
            ddlTarget.Items.Add("C");
            ddlTarget.Items.Add("D");

            myPlaceHolder.Controls.Add(ddlTarget);
            arrDDL[i] = ddlTarget;
        }

        for (i = 0; i < intControlCountTXB; i += 1)
        {
            txbTarget = new TextBox();
            txbTarget.ID = "TXB" + i.ToString();

            myPlaceHolder.Controls.Add(txbTarget);
            arrTXB[i] = txbTarget;

        }

    }




    protected void btnAddTextBox_Click(object sender, EventArgs e)
    {
        // Handled in preInit due to event sequencing.
    }

    protected void btnAddDDL_Click(object sender, EventArgs e)
    {
        // Handled in preInit due to event sequencing.            
    }


    public static Control GetPostBackControl(Page thePage)
    {
        Control myControl = null;
        string ctrlName = thePage.Request.Params.Get("__EVENTTARGET");
        if (((ctrlName != null) & (ctrlName != string.Empty)))
        {
            myControl = thePage.FindControl(ctrlName);
        }
        else
        {
            foreach (string Item in thePage.Request.Form)
            {
                Control c = thePage.FindControl(Item);
                if (((c) is System.Web.UI.WebControls.Button))
                {
                    myControl = c;
                }
            }

        }
        return myControl;
    }

}

И файл .ASPX:

    <form runat="server" id="frmMaster">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <a id="top" name="top"></a>


    <ajax:UpdateProgress id="uprMain" runat="server" AssociatedUpdatePanelID="upMain" DisplayAfter="0">
        <progresstemplate>        
            <div id="spnLoading" class="LoadingDiv">
                <table cellspacing="0" cellpadding="0" class="LoadingTable">
                    <tr>
                        <td width="100%" height="100%" class="LoadingTableCell">
                            <img src="images/icon_loading.gif">&nbsp;Please Wait...
                        </td>
                    </tr>
                </table>
            </div>
        </progresstemplate>
    </ajax:UpdateProgress> 


    <div id="globalWrapper">
        <div id="contentstart">

            <asp:UpdatePanel ID="upMain" runat="server">
                <ContentTemplate>
                    <asp:TextBox ID="hid" runat="server" />
                    <asp:PlaceHolder runat="server" ID="myPlaceHolder"></asp:PlaceHolder>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="btnAddTextBox" EventName="Click" />
                </Triggers>                    
            </asp:UpdatePanel>                            

            <asp:Button ID="btnAddTextBox" runat="server"  Text="Add TextBox" OnClick="btnAddTextBox_Click" />

            <asp:Button ID="btnAddDDL" runat="server"  Text="Add DDL" OnClick="btnAddDDL_Click" />

            <asp:UpdatePanel ID="UpdatePanel2" runat="server">
                <ContentTemplate>
                    <asp:Label runat="server" ID="MyLabel"></asp:Label>
                </ContentTemplate>
            </asp:UpdatePanel>              

        </div>
    </div>
    <br />
    <br />
    <div id="divFooter" class="Footer" runat="server" visible="true">
        <br />
        Copyright © 2012. All rights reserved.
        <br />
        <br />
        <br />
    </div>        
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...