2009-12-02 1 views
1

Je tente d'écrire un contrôle personnalisé. Je veux autoriser son utilisateur à spécifier un DataSourceId (un peu comme GridView, Repeater, etc.).Le contrôle personnalisé utilise DataSourceId

Je peux trouver la source de données qui correspond à l'identifiant. Et je peux obtenir le DataSourceView associé. Mais la seule façon d'obtenir les données semble être avec une méthode Select asynchrone. Bien sûr, je peux configurer le rappel de sorte que mon code bloque jusqu'à ce que le rappel se produise. Mais cela demande tellement de girations bizarres que je soupçonne que je fais quelque chose de mal.

Si je veux qu'un contrôle fonctionne comme certains des autres contrôles de données ASP.NET, que dois-je faire différemment?

est ici un peu que je l'ai écrit:

string dataSourceId = "SomeDataSourceForTesting"; 
    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     IDataSource ds = (IDataSource)Parent.FindControl(dataSourceId); 
     List<string> viewNames = new List<string>(); 
     foreach(string name in ds.GetViewNames()) 
     { 
      viewNames.Add(name); 
     } 
     string viewname = viewNames[0]; 
     writer.WriteLine("the viewname is " + viewname); 
     DataSourceView view = ds.GetView(viewname); 
     view.Select(...); //this really has to be asynchronous? 
     //write out some stuff from the data source 
    } 

Répondre

1

Quel type de contrôle DataBound voulez-vous? Si vous voulez un format tabulaire, vous devez dériver votre contrôle de System.Web.UI.WebControls.DataBoundControl. Et pour le format hiérarchique dérivent de System.Web.UI.WebControls.HierarchicalDataBoundControl. Les deux ont une propriété pour assigner un contrôle DataSource.

Pour DataBoundControl, remplacez PerformDataBinding. Cette méthode a un paramètre nommé data qui contient les données fournies par DataSource.

public class Test : System.Web.UI.WebControls.DataBoundControl 
{ 

    protected override void PerformDataBinding(System.Collections.IEnumerable data) 
    { 
     base.PerformDataBinding(data); 
    } 

} 

Pour HierarchicalDataBoundControl vous devez remplacer une méthode avec le même nom que DataBoundControl. Et obtenir la vue via la méthode GetData.

public class Test : System.Web.UI.WebControls.HierarchicalDataBoundControl 
{ 

    protected override void PerformDataBinding() 
    { 
     base.PerformDataBinding(); 

     System.Web.UI.HierarchicalDataSourceView view = base.GetData("View Path"); 
    } 

} 
+0

Parfait. Je me suis dit qu'il me manquait quelque chose comme ça. Merci! – Eric