Search code examples
c#-3.0anonymous-methodsvb.net-to-c#

VB.NET to C#: Using Data-Binding methods on object


In VB.NET I created 2 shorthand functions for data binding gridviews/dropdownlists/etc from any datasource (such as a DataReader or IReader or collection, etc):

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

I converted this to C# as such:

    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();
    }

Yet this obviously doesn't work as the Data-Binding methods aren't accessible to objItem, unless I explicity cast it to a type such as "ListBox" or "Gridview", etc. Similarly I want to retain the flexibility that objDataSource can be either an IReader, iCollection, etc.

Is it possible to replicate the VB.NET approach in C# using anonymous methods or something similar?

Thanks.


Solution

  • You could use the "var" anonymous type or enter a case statement to see what type your incoming object is.

    -edit-

    You are correct, the var does not seem workable here. Please try this solution instead:

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

    Regards, Paul