2009-07-22 7 views
0

У меня есть родительский GridView, у которого был дочерний GridView (код ниже), как я могу установить значение дочернего gridview? А также, как сохранить состояние дочернего gridview, т. Е. Если оно отображается или нет? Это функция, которая вызывается при нажатии кнопки, которая считывает через сетку видение родителя, которые были выбраны публикации:GridView, доступ к дочернему элементу GridView checkbox

protected void DeleteSelectedProducts_Click(object sender, EventArgs e) 
    { 
     bool atLeastOneRowDeleted = false; 

     // Iterate through the Products.Rows property 
     foreach (GridViewRow row in GridView1.Rows) 
     { 
      // Access the CheckBox 
      CheckBox cb = (CheckBox)row.FindControl("PublicationSelector"); 
      if (cb != null && cb.Checked) 
      { 
       // Delete row! (Well, not really...) 
       atLeastOneRowDeleted = true; 

       // First, get the ProductID for the selected row 
       int productID = 
        Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value); 

       // "Delete" the row 
       DeleteResults.Text += string.Format(
        "This would have deleted ProductID {0}<br />", productID); 
       //DeleteResults.Text = "something"; 
      } 


      // Show the Label if at least one row was deleted... 
      DeleteResults.Visible = atLeastOneRowDeleted; 
     } 
    } 

     <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" 
     AutoGenerateColumns="False" DataKeyNames="PublicationID" 
     DataSourceID="ObjectDataSource1" Width="467px" OnRowDataBound="GridView1_RowDataBound" 
     Font-Names="Verdana" Font-Size="Small"> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:CheckBox ID="PublicationSelector" runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:BoundField DataField="NameAbbrev" HeaderText="Publication Name" SortExpression="NameAbbrev" /> 
      <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" /> 
      <asp:BoundField DataField="State" HeaderText="State" SortExpression="State" /> 
      <asp:TemplateField HeaderText="Owners"> 
       <ItemTemplate> 
        <asp:Label ID="Owners" runat="server"></asp:Label> 
       </ItemTemplate> 
       <ItemStyle HorizontalAlign="Center" /> 
      </asp:TemplateField> 
      <asp:BoundField DataField="Type" HeaderText="Type" SortExpression="Type" /> 
      <asp:TemplateField HeaderStyle-CssClass="hidden-column" ItemStyle-CssClass="hidden-column" FooterStyle-CssClass="hidden-column"> 
       <ItemTemplate> 
        <tr> 
         <td colspan="8" > 
          <div id="<%# Eval("PublicationID") %>" style="display: none; position: relative;" > 
           <asp:GridView ID="GridView2_ABPubs" runat="server" AutoGenerateColumns="false" Width="100%" 
            DataKeyNames="PublicationID" Font-Names="Verdana" Font-Size="small"> 
            <Columns> 
             <asp:TemplateField> 
              <ItemTemplate> 
               <asp:CheckBox ID="ChildPublicationSelector" runat="server" /> 
              </ItemTemplate> 
             </asp:TemplateField> 
             <asp:BoundField DataField="NameAbbrev" HeaderText="Publication Name" SortExpression="NameAbbrev" /> 
            </Columns> 
           </asp:GridView> 
          </div> 
         </td> 
        </tr> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" 
     TypeName="shoom_dev._Default"> 
    </asp:ObjectDataSource> 

    <p> 
     <asp:Button ID="DeleteSelectedProducts" runat="server" 
      Text="Delete Selected Products" onclick="DeleteSelectedProducts_Click" /> 
    </p> 

    <p> 
     <asp:Label ID="DeleteResults" runat="server" EnableViewState="False" Visible="False"></asp:Label> 
    </p> 

ответ

1

ли метод же row.FindControl() у вас есть для флажка для управления GridView2_ABPubs , Это должно дать вам gridview, чтобы вы могли затем выполнить контроль поиска.

Однако, потратив три дня на просмотр и настройку GridView, ваш последний столбец шаблона с видом сетки для детей не нужен и узлам, так как они будут автоматически добавлены элементом управления GridView, что может сделать его более сложным найдите дочерний элемент управления.

Я также обнаружил, что FindControl не смотрел очень далеко вниз по стеку, так что я создал метод расширения для рекурсивного выискивать управления:

public static T FindControl<T>(this Control parent, string controlName) where T: Control 
{ 
    T found = parent.FindControl(controlName) as T; 
    if (found != null) 
     return found; 

    foreach(Control childControl in parent.Controls) 
    { 
     found = childControl.FindControl<T>(controlName) as T; 
     if (found != null) 
      break; 
    } 

    return found; 
} 
+0

Спасибо, что я отдам его. Тем не менее, я не понимаю эту строку »... Однако, просто потратив три дня на просмотр и настройку GridView, ваш последний столбец шаблонов с представлением дочерней сетки не нужен и узлам, так как они будут автоматически добавлены GridView, что может оказаться сложнее найти дочерний элемент управления ». Какой шаблон можно удалить? 3 дня, эта штука сводит меня с ума! Спасибо за помощь, R. – flavour404

+0

Вам нужен шаблон. Вам просто не нужно включать узлы TR и TD в макет элемента templateField последнего шаблона –

+0

. Я также новичок в C# и вашей вспомогательной функции в строке parent.FindControl (controlName), когда T возвращает ошибку «Тип параметра T не может использоваться с оператором «as», потому что у него нет ограничения типа класса или ограничения класса ». Извините, не пытаясь быть болью. – flavour404

0

Давида, это правильно:

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 

public static class FindControl<T> 
{public static T FindControl<T>(this Control parent, string controlName) where T : Control 
    { 
    T found = parent.FindControl(controlName) as T; 
    if (found != null) 
     return found; 
    foreach (Control childControl in parent.Controls) 
    { found = childControl.FindControl(controlName) as T; 
     if (found != null) 
      break; 
    } 
    return found; } 

}

Класс сохраняется как FindControl.cs. Как мне вызвать функцию?

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

Ну, я только что получил сообщение об ошибке, что не-родовые методы должны быть определены в статическом классе, так что я предполагаю, что у меня есть какая-то ошибка ... лол

Спасибо.

+0

измените имя класса на ControlExtensions, и все должно быть хорошо. и добавьте закрытие} для класса, и это должно быть хорошо. –

+0

Хорошо, после долгих чтений о методах расширения, мне удалось заставить его работать! Я могу, наконец, получить значение флажка в каждой строке дочернего gridview. Мой следующий вопрос: если флажок в строке родительского gridview не установлен, он не поднимает значение флажка дочернего gridview, почему? И как бы вы узнали, отображается ли в настоящее время gridview? Thanks R. – flavour404

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