我有一个aspx页面,它有一个GridView和一个带有摘要数据的Panel。摘要数据位于控件中,GridView位于aspx页面上。当有人点击摘要数据中的某个项目时,我想重新绑定GridView,但我无法弄清楚如何从控件中执行此操作。
我尝试使用FindControl,但可能没有正确使用它。
我尝试使用FindControl,但它没有用:
GridView gv = (GridView)FindControl("gvSearchResults"); //returns null
答案 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逻辑!