2011-10-18 1 views
1

Dans VB.NET, j'ai créé deux fonctions abrégées pour la liaison de données gridviews/dropdownlists/etc à partir de n'importe quelle source de données (DataReader ou IReader ou collection, etc.):VB.NET vers C#: Utilisation des méthodes de liaison de données sur l'objet

Public Shared Sub BindObject(ByVal objDataSource As Object, ByVal objItem As Object) 

    objItem.DataSource = objDataSource 
    objItem.DataBind() 
End Sub 

Public Shared Sub BindObject(ByVal objDataSource As Object, ByVal objItem As Object, ByVal sTextField As String, ByVal sValueField As String) 

    objItem.DataSource = objDataSource 

    If sTextField <> "" Then objItem.DataTextField = sTextField 
    If sValueField <> "" Then objItem.DataValueField = sValueField 

    objItem.DataBind() 
End Sub 

Je converti ce à C# en tant que tel:

public static void BindObject(object objDataSource, object objItem) 
    { 
     objItem.DataSource = objDataSource; 
     objItem.DataBind(); 
    } 

    public static void BindObject(object objDataSource, object objItem, string sTextField, string sValueField) 
    { 
     objItem.DataSource = objDataSource; 

     if (!string.IsNullOrEmpty(sTextField)) 
      objItem.DataTextField = sTextField; 
     if (!string.IsNullOrEmpty(sValueField)) 
      objItem.DataValueField = sValueField; 

     objItem.DataBind(); 
    } 

cela ne signifie évidemment pas pourtant travailler les méthodes de liaison de données ne sont pas accessibles à objItem, à moins que je jetai à un explicity tapez comme "ListBox" ou "Gridview", etc. De même, je veux de conserver la flexibilité objDataSource peut être soit un iReader, ICollection, etc.

Est-il possible de reproduire l'approche VB.NET en C# en utilisant des méthodes anonymes ou quelque chose de similaire?

Merci.

+0

Je peux juste décider d'ajouter une bibliothèque de classe VB, bien qu'il semble être un peu exagéré pour le plaisir d'une fonction – Peter

Répondre

1

Vous pouvez utiliser le type anonyme "var" ou entrer une instruction case pour voir le type de votre objet entrant.

-Edit-

Vous avez raison, le var ne semble pas réalisable ici. S'il vous plaît essayer cette solution à la place:

public void BindObject(object objDataSource, object objItem) 
     { 
      (objItem as BaseDataBoundControl).DataSource = objDataSource; 
      (objItem as BaseDataBoundControl).DataBind();  

     } 

Cordialement, Paul

+0

pourriez-vous fournir un exemple d'utilisation du type anonyme "var" dans les fonctions ci-dessus? J'ai essayé de l'ajouter à la tête de la fonction, mais cela n'a pas fonctionné et pas non plus: var test = objDataSource; test.DataSource = ... – Peter

+0

@Peter - oui, je ne pouvais pas faire travailler var non plus. Veuillez voir la solution éditée – Paul

+0

Cela semble fonctionner pour .net 3.5. Merci! – Peter

0

Vous avez désactivé Option Strict dans votre code VB. Tsk tsk — ce n'est pas vraiment le meilleur choix.

Pour obtenir un effet similaire en C#, vous pouvez le faire:

public static void BindObject(object objDataSource, dynamic objItem) 
{ 
    objItem.DataSource = objDataSource; 
    objItem.DataBind(); 
} 

public static void BindObject(object objDataSource, dynamic objItem, string sTextField, string sValueField) 
{ 
    objItem.DataSource = objDataSource; 

    if (!string.IsNullOrEmpty(sTextField)) 
     objItem.DataTextField = sTextField; 
    if (!string.IsNullOrEmpty(sValueField)) 
     objItem.DataValueField = sValueField; 

    objItem.DataBind(); 
} 

Mais encore une fois, vous devriez vraiment regarder dans une façon de faire qui préserve le contrôle de type fort compilation.

+0

Ah cela aurait été parfait, mais hélas, je n'utilise que asp.net 3.5 et limité à le faire par le serveur sur le site fonctionne – Peter

Questions connexes