2012-02-28 1 views
2

На самом деле я разрабатываю веб-шаблон с использованием asp.net и C#. У меня есть страница maintemp.aspx, которая включает страницу usercontrol. В моем usercontrol у меня есть listview, который в этом списке я должен создать динамическую таблицу внутри ItemTemplate на основе XML-файла.Как получить доступ к текстовому полю динамически созданной таблицы внутри списка просмотра страницы usercontrol?

Мой ListView код включая ItemTemplate является:

<asp:ListView ID="lv_Uc_Module" runat="server" 
        onitemediting="lv_Uc_Module_ItemEditing" 

        onitemcanceling="lv_Uc_Module_ItemCanceling" 
        onitemdeleting="lv_Uc_Module_ItemDeleting" 
        OnItemDataBound="lv_Uc_Module_ItemDataBound" 
        OnSorting="lv_Uc_Module_Sorting"> 

         <LayoutTemplate> 
          <asp:Table runat="server" ID="table_Lv_Layout"> 
           <asp:TableRow runat="server" ID="tr_Table_Layout"> 
            <asp:TableCell runat="server" ID="td_Table_Layout"> 
             <asp:Table runat="server" ID="itemPlaceholderContainer"> 
              <asp:TableRow runat="server" ID="tr_Table_IphContainer"> 

               <asp:TableHeaderCell runat="server"> 
                <asp:PlaceHolder ID="th_Ph_Lv_header" runat="server"></asp:PlaceHolder> 
               </asp:TableHeaderCell> 
              </asp:TableRow> 
              <asp:TableRow runat="server"> 
               <asp:TableCell runat="server"> 

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

               </asp:TableCell> 

              </asp:TableRow> 
             </asp:Table> 
            </asp:TableCell> 
           </asp:TableRow> 
           <asp:TableRow runat="server" ID="tr_Validate_Table_Layout"> 
            <asp:TableCell runat="server" ID="td_Validate_Table_Layout" HorizontalAlign="Center" BackColor="#CCCCCC"> 
             <asp:ValidationSummary ID="ValidationSummary1" runat="server" HeaderText="You received the following errors:" ShowMessageBox="true" ShowSummary="false" ValidationGroup="VGEditTmp" /> 

            </asp:TableCell> 
           </asp:TableRow> 
          </asp:Table> 
          <br /> 
          <asp:DataPager ID="lv_DataPager" runat="server" PagedControlID="lv_Uc_Module" PageSize="25" OnPreRender="lv_DataPager_PreRender"> 
           <Fields> 
            <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowLastPageButton="true" FirstPageImageUrl="~/Images/First.png" LastPageImageUrl="~/Images/Last.png" NextPageImageUrl="~/Images/Next.png" PreviousPageImageUrl="~/Images/Previous.png" /> 
            <asp:TemplatePagerField> 
             <PagerTemplate> 
              <span style="color:Blue;"> 

              </span> 
             </PagerTemplate> 
            </asp:TemplatePagerField> 
           </Fields> 
          </asp:DataPager> 
         </LayoutTemplate> 

         <ItemTemplate> 
          <asp:TableRow runat="server"> 
           <asp:TableCell runat="server"> 

            <asp:Table runat="server" ID="Table_Lv_ItemTemplate"></asp:Table> 
           </asp:TableCell> 
           <asp:TableCell runat="server"> 
            <asp:Button ID="btn_Edit" runat="server" CommandName="Edit" Text="" CssClass="btn_Edit" CausesValidation="True" Visible="false" /> 
            <asp:Button ID="btn_Delete" runat="server" CommandName="Delete" Text="" CssClass="btn_Delete" CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this item?');" Visible="false" /> 
           </asp:TableCell> 
          </asp:TableRow> 

         </ItemTemplate> 

Как вы можете видеть на ListView ItemTemplate части я положил с ID = "Table_Lv_ItemTemplate", которые я создаю динамическую таблицу здесь.

Я поставил динамический код таблицы в функции ItemDataBound, как показано ниже:

protected void lv_Uc_Module_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (tempDataBound == 0 && !"".Equals(hid_ChooseModule.Value)) 
    { 
     XmlDocument xDocRead = new XmlDocument(); 
     xDocRead.Load(Server.MapPath("ModuleTemp.xml")); 
     lv_Uc_Module_DataBind(""); 

     Table table_Lv_ItemTemplate = (Table)e.Item.FindControl("Table_Lv_ItemTemplate"); 
     table_Lv_ItemTemplate.Controls.Clear(); 
     //table_Lv_ItemTemplate.Dispose(); 

     tempDataBound++; 
    } 

    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     XmlDocument xDocRead = new XmlDocument(); 
     xDocRead.Load(Server.MapPath("ModuleTemp.xml")); 
     string xModuleName = hid_ChooseModule.Value; 
     XmlNode xColCounter; 
     TableRow tr_DataBound = new TableRow(); 
     TableRow tr_Lv_Header = new TableRow(); 

     if (!"".Equals(hid_ChooseModule.Value)) 
     { 
      xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List"); 
     } 
     else 
     { 
      xModuleName = xDocRead.SelectSingleNode("ModuleTemp").FirstChild.Name; 
      xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List"); 
     } 
     int pkCounter = 0, nonPkCounter = 0, colCount = xColCounter.ChildNodes.Count; 
     string[] primaryKey = new string[30]; 
     string[] nonPrimaryKey = new string[colCount + 1]; 

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

     System.Data.DataRowView rowView = e.Item.DataItem as System.Data.DataRowView; 
     TableCell tc_Lv_Header = new TableCell(); 
     if (!"".Equals(hid_ChooseModule.Value)) 
     { 
      if (tempHeader == 0) 
      { 
       tempHeader++; 
       for (int i = 1; i <= pkCounter + nonPkCounter; i++) 
       { 
        tc_Lv_Header = new TableCell(); 
        Label lb = new Label(); 

        if (i <= pkCounter) 
        { 
         lb.Text = primaryKey[i - 1]; 
        } 
        else 
        { 
         lb.Text = nonPrimaryKey[i - pkCounter - 1]; 
        } 

        lb.ID = "lb" + i + "_Table_IphContainer"; 
        tc_Lv_Header.Controls.Add(lb); 
        tc_Lv_Header.CssClass = "th_ItemTemplate"; 
        tr_Lv_Header.Cells.Add(tc_Lv_Header); 
       } 

       tr_Lv_Header.Cells.Add(tc_Lv_Header); 

       table_Header.Rows.Add(tr_Lv_Header); 
       PlaceHolder th_Ph_Lv_Hedear = (PlaceHolder)lv_Uc_Module.FindControl("th_Ph_Lv_header"); 
       th_Ph_Lv_Hedear.Controls.Add(table_Header); 
      } 
     } 
     TableCell tc_DataBound = new TableCell(); 

     if (editTempSelection == e.Item.DataItemIndex) 
     { 
      for (int i = 1; i <= pkCounter + nonPkCounter; i++) 
      { 
       tc_DataBound = new TableCell(); 
       TextBox tb = new TextBox(); 
       tb.Width = 110; 
       tb.Text = rowView[i - 1].ToString(); 
       tb.ID = "td_EditTemp" + i + "_" + e.Item.DataItemIndex; 
       tc_DataBound.Controls.Add(tb); 
       tc_DataBound.CssClass = "td_Tb_ItemTemplate"; 
       tr_DataBound.Cells.Add(tc_DataBound); 
      } 
     } 
     else 
     { 
      for (int i = 1; i <= pkCounter + nonPkCounter; i++) 
      { 
       tc_DataBound = new TableCell(); 
       Label lb = new Label(); 
       lb.Text = rowView[i - 1].ToString(); 
       lb.ID = "lb_ItemTemp" + i + "_" + e.Item.DataItemIndex; 
       tc_DataBound.Controls.Add(lb); 
       tc_DataBound.CssClass = "td_Lb_ItemTemplate"; 
       tr_DataBound.Cells.Add(tc_DataBound); 
      } 
     } 
     // add button to the columns 
     if (editTempSelection != e.Item.DataItemIndex) 
     { 
      tc_DataBound = new TableCell(); 
      Button btn_Edit = new Button(); 
      btn_Edit.ID = "btn_Edit"; 
      btn_Edit.CommandName = "Edit"; 
      btn_Edit.CssClass = "btn_Edit"; 
      btn_Edit.CausesValidation = true; 
      tc_DataBound.Controls.Add(btn_Edit); 
      tr_DataBound.Cells.Add(tc_DataBound); 

      tc_DataBound = new TableCell(); 
      Button btn_Delete = new Button(); 
      btn_Delete.ID = "btn_Delete"; 
      btn_Delete.CommandName = "Delete"; 
      btn_Delete.CssClass = "btn_Delete"; 
      btn_Delete.CausesValidation = false; 
      btn_Delete.OnClientClick = "return confirm('Are you sure you want to delete this item?');"; 
      tc_DataBound.Controls.Add(btn_Delete); 
      tr_DataBound.Cells.Add(tc_DataBound); 
     } 
     else 
     { 
      tc_DataBound = new TableCell(); 
      Button btn_Update = new Button(); 
      btn_Update.ID = "btn_Update"; 
      btn_Update.CommandName = "Update"; 
      btn_Update.CssClass = "btn_Update"; 
      btn_Update.ValidationGroup = "VGEditTmp"; 
      tc_DataBound.Controls.Add(btn_Update); 
      tr_DataBound.Cells.Add(tc_DataBound); 

      tc_DataBound = new TableCell(); 
      Button btn_Cancel = new Button(); 
      btn_Cancel.ID = "btn_Cancel"; 
      btn_Cancel.CommandName = "Cancel"; 
      btn_Cancel.CssClass = "btn_Cancel"; 
      btn_Cancel.CausesValidation = false; 
      tc_DataBound.Controls.Add(btn_Cancel); 
      tr_DataBound.Cells.Add(tc_DataBound); 
      tr_DataBound.CssClass = "tr_Edit_ItemTemplate"; 
     } 

     if (editTempSelection == e.Item.DataItemIndex) 
     { 
      lv_Uc_Module_ItemUpdating(sender, e.Item.DataItemIndex); 
     } 
     // add columns to the row 
     tr_DataBound.Cells.Add(tc_DataBound); 
     Table table_Lv_ItemTemplate = (Table)e.Item.FindControl("Table_Lv_ItemTemplate"); 
     table_Lv_ItemTemplate.Rows.Add(tr_DataBound); 
    } 
} 

В результате этого данные связанного ниже изображения. И он динамически считывает данные из XML-файла и создает таблицу. enter image description here

Как только пользователи нажимают на кнопку редактирования, как показано ниже, они могут редактировать данные строки.

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

Я попытался TextBox tempLabelLv = (TextBox)add_Table.FindControl("td_EditTemp2_5");add_Table мой динамический идентификатор таблицы, и я попытался TextBox tempLabelLv = (TextBox)lv_Uc_Module.FindControl("td_EditTemp2_5"); что lv_Uc_Module мой ListView идентификатор. Но все же я не могу получить доступ к этим текстовым полям.

Не могли бы вы посоветовать мне, как преодолеть эту проблему, и получить данные этих текстовых полей для обновления базы данных? Цените свое внимание.

+0

Почему в мире вы выбрали ** ListView ** и ** Table ** контроль над простым ** GridView ** control ?, где у вас есть намного лучшие инструменты для всех видов поведения и в ваш случай просто выберите строку, которая будет в режиме редактирования, и после отправки редактирования вы будете иметь исходные значения и новые значения? Швы очень плохо подходят с помощью 'table', и вы можете избежать так много строк кода ... – balexandre

ответ

0

Это всего лишь догадка, поэтому не сходите с ног, если это неправильно: D Хорошо, скажем, у вас есть страница, созданная с помощью динамически. Естественно, что элементы в этом динамическом создании не будут частью файла дизайна, верно? Поэтому скажите, что я динамически создаю ярлык через какой-то скрипт, и теперь я хочу попасть внутрь него. Я также мог бы, по-моему, добавить к нему признание, вручную представляя его. Поэтому для доступа к этой этикетке я бы сделал это:

public class yourPageOrClassNameOrSomethingOrAnotherOrIDontKnow: System.Web.UI.Page 
{ 
    protected System.Web.UI.WebControls.Label myLabel; 
... 
} 

Теперь я могу получить к нему доступ, даже если я создам его динамически. Если у вас есть репитер или список или что у вас есть, что вы создали динамически, обязательно зарегистрируйте его, а затем используйте свой ранее описанный метод (TextBox tempLabelLv = (TextBox) add_Table.FindControl ("td_EditTemp2_5");), чтобы найти его , (В приведенном выше примере вы бы зарегистрировать «add_Table» с помощью защищенного System.Web.UI.HtmlControls.HtmlTable add_Table, "Надеюсь, что это помогает немного Если нет, то я попробовал =.).

0

Вы можете использовать динамическую таблицу, поэтому, каждый раз, когда ваша страница перегружена (например, если вы нажимаете любую кнопку), ваша таблица будет очищена от строк, ячеек и элементов управления, которые были добавлены динамически. Это не идеальное решение, но попробуйте переписать таблицу на событии Page_Load.

Смежные вопросы