как получить доступ к текстовому полю динамически созданной таблицы на странице управления пользователем? - PullRequest
0 голосов
/ 16 февраля 2012

На самом деле я создаю веб-шаблон с использованием asp.net и c #.на моей странице user control мне нужно создать таблицу динамически.я просто читаю данные из XML-файла, затем извлекаю имя и количество столбцов и строк каждой таблицы.в то время как я создаю таблицу, я назначаю имя и идентификатор каждой ячейке.потому что у меня есть одна строка, включая некоторые textbox для добавления данных в базу данных.но после создания таблицы я не могу получить доступ к ячейкам textbox на основе идентификатора, чтобы получить их данные и вставить их в базу данных.мой код динамической таблицы:

public void CreateAddDynamicTable()
{
    XmlDocument xDocRead = new XmlDocument();
    xDocRead.Load(Server.MapPath("ModuleTemp.xml"));
    string xModuleName = hid_ChooseModule.Value;
    XmlNode xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List");
    int colCount = xColCounter.ChildNodes.Count;

    int nonPkCounter = 0;
    string[] nonPrimaryKey = new string[100];
    string[] nonPkNewDataTemp = new string[100];

    for (int i = 1; i <= colCount; i++)
    {
        if (xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Add/TableColumn" + i).Attributes.GetNamedItem("IsPrimaryKey").Value == "N")
        {
            nonPrimaryKey[nonPkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Add/TableColumn" + i).Attributes.GetNamedItem("Name").Value;
            nonPkCounter++;
        }
    }

    ph_Uc_AddModule.Controls.Clear();

    // Fetch the number of Rows and Columns for the table 
    // using the properties
    int tblRows = nonPkCounter;
    int tblCols = 2;

    // Create a Table and set its properties 
    Table tbl = new Table();
    // Add the table to the placeholder control
    ph_Uc_AddModule.Controls.Add(tbl);
    // Now iterate through the table and add your controls 
    for (int i = 0; i < tblRows; i++)
    {
        TableRow tr = new TableRow();
        for (int j = 0; j < tblCols; j++)
        {
            TableCell tc = new TableCell();
            Label td_Add_Header = new Label();
            TextBox td_Add = new TextBox();

            if (j == 0)
            {
                td_Add_Header.Text = nonPrimaryKey[i];
                td_Add_Header.ID = "lb" + (i + 1) + "_header_AddModule";

                // Add the control to the TableCell
                tc.Controls.Add(td_Add_Header);
                tc.CssClass = "td_Header_AddModule";
            }
            else
            {
                td_Add.Text = "";
                td_Add.ID = "tb" + (i + 1) + "_AddModule";
                // Add the control to the TableCell
                tc.Controls.Add(td_Add);
                tc.CssClass = "td_Tb_AddModule";
            }

            // Add the TableCell to the TableRow
            tr.Cells.Add(tc);
        }
        // Add the TableRow to the Table
        tbl.Rows.Add(tr);
    }
}

моя страница управления пользователем, которая содержит PlaceHolder, выглядит следующим образом:

<asp:Panel ID="pn_Uc_TModule" runat="server">

<asp:Table runat="server" ID="table_Uc_TModule" CssClass="table_Uc_TModule" Width="100%">
 <asp:TableRow runat="server" VerticalAlign="Top" Height="50px">
                <asp:TableCell runat="server">
                    <asp:Button runat="server" Text="" CssClass="btn_Add_Active" OnClick="btn_AddNew_Click" />
                    <asp:Button ID="btn_Cancel_NewItem" runat="server" Text="" CssClass="btn_Cancel_New" OnClick="btn_Cancel_AddNew" Visible="false" />

                    <asp:Table runat="server" ID="table_Uc_AddModule" Visible="false">
                        <asp:TableRow runat="server">
                            <asp:TableCell runat="server" >

                                <asp:PlaceHolder ID="ph_Uc_AddModule" runat="server">
                                </asp:PlaceHolder>

                            </asp:TableCell>
                        </asp:TableRow>
                        <asp:TableRow ID="TableRow1" runat="server">
                            <asp:TableCell runat="server" CssClass="td_Tb_AddModule" HorizontalAlign="Center">
                                <asp:Button ID="btn_Insert" runat="server" OnClick="Uc_AddModule_ItemInsert" Text="" CssClass="btn_Add" />
                                <asp:Button ID="btn_Cancel" runat="server" OnClick="Uc_AddModule_Clear" Text="" CssClass="btn_Clear" />
                            </asp:TableCell>
                        </asp:TableRow>
                    </asp:Table>

                </asp:TableCell>
            </asp:TableRow>
</asp:Table>
</asp:Panel>

Я использую метод ниже в моей функции вставки вкод для доступа к данным, вставленным в textbox:

for (int i = 1; i <= nonPkCounter; i++)
    {
        TextBox textBox = (ph_Uc_AddModule.FindControl("tb" + i + "_AddModule")) as TextBox;

    }

Я пытался pn_Uc_TModule.FindControl("tb" + i + "_AddModule"), а также This.ph_Uc_AddModule.FindControl("tb" + i + "_AddModule"), но все еще не могу получить данные texbox для вставки в базу данных.не могли бы вы подсказать мне, как это сделать.ценим ваше внимание.

1 Ответ

1 голос
/ 16 февраля 2012

Вы должны вызывать CreateAddDynamicTable для вашего события Init всегда.Это даст смысл представлению, и asp.net загрузит все значения в элементы управления.Затем вы можете добавить текстовые поля в коллекцию и получить к ним доступ, не используя FindControl, только ссылки в вашем событии Page_Load.

...