如何从页面上的控件访问页面上的GridView?

时间:2009-03-06 15:45:50

标签: c# asp.net

我有一个aspx页面,它有一个GridView和一个带有摘要数据的Panel。摘要数据位于控件中,GridView位于aspx页面上。当有人点击摘要数据中的某个项目时,我想重新绑定GridView,但我无法弄清楚如何从控件中执行此操作。

我尝试使用FindControl,但可能没有正确使用它。

我尝试使用FindControl,但它没有用:

GridView gv = (GridView)FindControl("gvSearchResults"); //returns null

4 个答案:

答案 0 :(得分:1)

您应该将GridView引用作为控件的属性发送到控件(

public GridView GridViewToRebind {get; set;}

或者别的什么。)

答案 1 :(得分:1)

您的摘要数据属于什么样的控制?也许你可以在你点击项目时触发的摘要数据控件中添加一个EventHandler。您可以在.aspx代码隐藏中为事件编写处理程序,然后在.aspx的Page_Load()中将它们链接起来。

这是一个简单的例子:

Default.aspx的:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GridViewEventHandling._Default" %>
<%@ Register TagName="MyControl" TagPrefix="mc" Src="~/SampleData.ascx" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:GridView ID="uxGridView" runat="server" AutoGenerateColumns="true">
        </asp:GridView>

        <mc:MyControl ID="myControl" runat="server" />

    </div>
    </form>
</body>
</html>

Default.aspx.cs:

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

namespace GridViewEventHandling
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            myControl.OnLinkClick += new EventHandler(myControl_OnLinkClick);
        }

        private void myControl_OnLinkClick(object sender, EventArgs e)
        {
            uxGridView.DataSource = GetDataSource();
            uxGridView.DataBind();
        }

        private IDictionary<string, string> GetDataSource()
        {
            IDictionary<string, string> dict = new Dictionary<string, string>();
            dict.Add("Product 1", "Description 1");
            dict.Add("Product 2", "Description 2");
            dict.Add("Product 3", "Description 3");
            return dict;
        }


    }
}

SampleData.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SampleData.ascx.cs" Inherits="GridViewEventHandling.SampleData" %>

<asp:LinkButton ID="item1" OnClick="HandleClick" CommandName="BindGrid" CommandArgument="1" Text="Item 1" runat="server" /><br />
<asp:LinkButton ID="item2" OnClick="HandleClick" CommandName="BindGrid" CommandArgument="2" Text="Item 2" runat="server" /><br />
<asp:LinkButton ID="item3" OnClick="HandleClick" CommandName="BindGrid" CommandArgument="3" Text="Item 3" runat="server" /><br />

SampleData.ascx.cs:

using System;

namespace GridViewEventHandling
{
    public partial class SampleData : System.Web.UI.UserControl
    {
        public event EventHandler OnLinkClick;

        protected void HandleClick(object sender, EventArgs args)
        {
            if (OnLinkClick != null)
                OnLinkClick(sender, args);
        }
    }
}

答案 2 :(得分:0)

容器使用

FindControl 来查找它包含的子控件,如果使用Page对象来查找gridview,则应该能够找到它。你如何使用 FindControl 方法?你能发一些简单的代码吗?

答案 3 :(得分:0)

如果你的所有控件都在同一页面上,那么你应该看到GridView(在intellisense中,来自它被调用的事件),而不必使用FindControl。如果您的摘要数据位于单独的UserControl中,请执行以下步骤:

来自UserControl,您的摘要数据在哪里,引用父页面(假设它是SomePage.aspx):
SomePage parent =(SomePage)this.Page;
在SomePage.aspx代码隐藏中,放一个重新绑定的方法:
public void Rebind(){gridview1.Bind(); }
然后你可以从用户控件中调用Rebind方法:parent.Rebind()
你还可以添加一些参数或其他一些UI / biz逻辑!