Использование FindControl для получения GridView на странице содержимого - PullRequest
1 голос
/ 29 июня 2011

Я хотел бы найти GridView Control в отдельном классе, и у меня возникли проблемы с этим.Я даже пытался разместить свой код на странице aspx.cs безрезультатно.Я продолжаю получать ссылку на объект, не установленную для экземпляра объекта.Я уверен, что есть простой шаг, который я пропускаю, но в своем исследовании я не могу ничего найти.

Aspx code

  <asp:GridView ID="GridView1" EnableViewState="true" 
    runat="server"  
    BackColor="White" BorderColor="#CC9966"
    BorderStyle="None" BorderWidth="1px" CellPadding="4" Width="933px" 
    onrowdatabound="GridView1_RowDataBound"  
    onrowdeleting="GridView1_RowDeleting" 
    onrowediting="GridView1_RowEditing"
    onrowupdating="GridView1_RowUpdating" 
    onsorting="GridView1_Sorting"
    AllowSorting="true"
    AutoGenerateColumns="False" 
    PersistedSelection="true" onrowcancelingedit="GridView1_RowCancelingEdit">
    <EditRowStyle Font-Size="Small" Width="100px" />
    <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" />
    <Columns>
      <asp:TemplateField>
        <ItemTemplate>
          <asp:LinkButton runat="server" ID="EditLinkButton" CausesValidation="True"
                          Text="Edit" CommandName="Edit"/>
          <asp:LinkButton runat="server" ID="DeleteLinkButton" CausesValidation="False"
                          Text="Delete" CommandName="Delete"/>
        </ItemTemplate>
        <EditItemTemplate>
          <asp:LinkButton runat="server" ID="UpdateLinkButton" CausesValidation="True"
                          Text="Update" CommandName="Update"/>
          <asp:LinkButton runat="server" ID="CancelLinkButton" CausesValidation="False"
                          Text="Cancel" CommandName="Cancel"/>
        </EditItemTemplate>
      </asp:TemplateField>
    </Columns>
  </asp:GridView>

.cs code

protected void Page_Load(object sender, EventArgs e) {
  SetDirectory();

  System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler;
  GridView GridViewCopy = (GridView)page.FindControl("GridView1");

  Log.WriteLine("SortBindGrid: GridView Row Count: " + 
                GridViewCopy.Rows.Count, Log.DEBUG_LEVEL.TERSE);
  return;
}

Я пробовал несколько вариантов использования MainContent_GridView для поиска и Master.FindControl с одинаковым результатом.

Ответы [ 3 ]

4 голосов
/ 30 июня 2011

В одном из ваших комментариев вы утверждаете, что GridView отсутствует на главной странице, поэтому можно ли предположить, что оно находится на странице, которая использует главную страницу?И поэтому он должен быть в ContentPlaceholder элементе управления?

Ключевой вопрос заключается в том, что FindControl метод ищет только прямых потомков (выделение добавлено):

Этот метод найдет элемент управления, только если элемент управления непосредственно содержится в указанном контейнере;то есть метод не выполняет поиск во всей иерархии элементов управления внутри элементов управления .

Так что вам необходимо:

  1. Поиск элемента управленияв пределах правильного ContentPlaceholder элемента управления, а не из Page.
  2. Регулярно проходите через каждый из элементов управления в Page.Controls, пока не найдете нужный элемент управления.

Пример 2:

private Control FindControlRecursive(Control rootControl, string controlID)
{
    if (rootControl.ID == controlID) return rootControl;

    foreach (Control controlToSearch in rootControl.Controls)
    {
        Control controlToReturn = 
            FindControlRecursive(controlToSearch, controlID);
        if (controlToReturn != null) return controlToReturn;
    }
    return null;
}

Как только вы получите свой контроль, вы должны разыграть его, используя as, а затем проверить на ноль на случай, если это не совсем то, что вы ожидали:

var gridView = FindControlRecursively(Page, "GridView1") as GridView

if (null != gridView) {
  // Do Stuff
}
0 голосов
/ 29 июня 2011

Брайан понял все правильно, но он забыл основную часть. Вы не сможете использовать его код, если не добавите этот код поверх HTML-кода файла, в котором хотите его использовать. (Page.aspx)

<%@ MasterType VirtualPath="~/Master/Site.master" %>

тогда вы можете использовать предложенный Брайаном код:

GridView grid = this.Master.FindControl("GridView1");

Edit: Если вы хотите использовать gridview из другого класса в том же файле, я бы использовал следующее: Добавьте это к классу, созданному, когда вы создаете страницу

 public partial class YourPageName: System.Web.UI.Page
 {
    public static Gridview mygrid = this.GridviewnameOFYourASPX
    ...
 }

А в свой пользовательский класс добавьте это в свой метод

YourPageName.mygrid.(The changes you want to make);
0 голосов
/ 29 июня 2011

Не получайте страницу от HttpContext, если вы уже находитесь на странице. Вместо этого есть ли элемент управления, из которого вы можете использовать FindControl? Вместо использования страницы, используйте:

parentControl.FindControl("GridView1") as GridView;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...