使用FindControl在内容页面中获取GridView

时间:2011-06-29 18:59:42

标签: asp.net gridview master-pages findcontrol

我想在一个单独的课程中找到一个GridView控件,我遇到了问题。我甚至尝试将我的代码放在aspx.cs页面中无济于事。我不断将Object引用设置为对象的实例。我确信我缺少一个简单的步骤,但在我的研究中,我似乎找不到任何东西。

Aspx代码

  <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代码

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获取find和Master.FindControl的一些变体,结果完全相同。

3 个答案:

答案 0 :(得分:4)

在您的一条评论中,您声明GridView不在母版页上,因此可以安全地假设它位于使用母版页的页面上吗?因此它必须在ContentPlaceholder控件中?

关键问题是FindControl方法only looks for direct children(强调添加):

  

仅当控件直接包含在指定容器中时,此方法才会找到控件;也就是说,该方法不会在控件的控件层次结构中进行搜索

所以你需要:

  1. 在正确的ContentPlaceholder控件中搜索控件,而不是从Page搜索。
  2. 递归遍历Page.Controls中的每个控件,直到找到您所关注的控件。
  3. 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
    }
    

答案 1 :(得分:0)

如果您已经在页面内,请不要从HttpContext获取页面。相反,是否有一个控件可以使用FindControl?而不是使用页面,使用:

parentControl.FindControl("GridView1") as GridView;

相反。从页面级别找到网格存在问题,并且使用更靠近网格的较低级别控件将获得更好的成功。

答案 2 :(得分:0)

布莱恩做对了,但他忘记了必不可少的部分。 除非您在要使用它的文件的HTML代码之上添加此代码,否则您将无法使用他的代码。(Page.aspx)

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

然后你可以使用Brian建议的代码:

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

编辑: 如果你想在同一个文件中的另一个类中使用gridview,我将使用以下内容: 将其添加到创建页面时创建的类<​​/ p>

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

并在您的自定义类中添加此方法

YourPageName.mygrid.(The changes you want to make);