2009-03-06 5 views
0

J'ai une page aspx qui a un GridView et un Panel avec des données récapitulatives. Les données récapitulatives sont dans un contrôle et le GridView est sur la page aspx. Quand quelqu'un clique sur un élément dans les données de résumé, je veux relier le GridView, mais je n'arrive pas à comprendre comment le faire à partir du contrôle.Comment puis-je accéder à un GridView sur une page à partir d'un contrôle sur une page?

J'ai essayé d'utiliser FindControl, mais je ne l'ai probablement pas utilisé correctement.

J'ai essayé avec FindControl, mais il ne fonctionne pas:

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

Répondre

1

Vous devez envoyer une référence au contrôle GridView comme propriété du contrôle (

public GridView GridViewToRebind {get; set;} 

ou quelque chose) .

+0

Pouvez-vous donner un exemple? – Xaisoft

+0

Je l'ai mis dans la page aspx en tant que GridView et je suppose que j'ai besoin de mettre une propriété dans le contrôle pour récupérer le GridView. – Xaisoft

+0

Je n'arrive pas à comprendre comment utiliser FindControl pour obtenir GridView. – Xaisoft

0

FindControl est utilisé par le conteneur pour trouver le contrôle enfant qu'il contient, si vous utilisez l'objet Page pour trouver la grille, vous devriez pouvoir le trouver. Comment utilisez-vous votre méthode FindControl? Pouvez-vous poster du code simple.

+0

Pouvez-vous donner un exemple d'utilisation de la page pour trouver le GridView? – Xaisoft

0

Si tous vos contrôles sont sur la même page, alors vous devriez voir GridView (dans intellisense, à partir d'un événement appelé), et ne pas avoir à utiliser FindControl. Si votre summarydata est UserControl séparée, suivre les étapes suivantes:

De UserControl, où est votre données récapitulatives, page parent de référence (Disons que c'est SomePage.aspx):
parent UnePage = (UnePage) this.Page;
dans somecode.aspx codebehind, mettez une méthode qui effectue la reliaison:
public void Rebind() {gridview1.Bind(); }
puis vous pouvez appeler cette méthode Rebind à partir de votre contrôle utilisateur: parent.Rebind()
vous pouvez également ajouter des paramètres ou une autre logique UI/biz à lui!

1

Quel est le type de contrôle dans vos données récapitulatives? Peut-être pourriez-vous ajouter un EventHandler à votre contrôle Summary Data qui se déclenche lorsque vous cliquez sur un élément. Vous devez écrire le gestionnaire de l'événement dans votre code .aspx, puis les lier dans le fichier Page_Load de votre .aspx.

Voici un exemple rapide:

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); 
     } 
    } 
} 
+0

Voici comment je le ferais, la logique pour rafraîchir le gridview appartient vraiment à la page puisque c'est là qu'elle réside. Le faire à partir du contrôle n'est pas idéal. – spilliton

Questions connexes