Answer/HowTo : Accessing columns collection via the private autoGenColumnsArray property in a Data

Discussion in 'ASP .Net' started by Jason Coyne Gaijin42, Apr 4, 2004.

  1. I have seen several people looking for a way to access the Columns
    collection when using the AutoGenerate = true option. Some
    people have gotten so far as to find the private autoGenColumnsArray
    that has the information, but we as developers have no way to access
    this information.

    I have come up with a solution for the problem, (as I am sure many
    others have) using reflection. Here is some sample code that will
    print out the auto generated column names from a datagrid.

    As stated, this code uses reflection. Reflection is slow. It might not
    also be allowed depending on your system's security settings. Also, if
    MS changes the internal structure of the DataGrid, this might break.
    (We are breaking encapsulation)

    Provided, is a function that will generically allow you to get the
    value of any private member of a class using reflection.

    Sorry about the formatting, I dont know a good way to format code for
    usenet. Visual Studio should clean up the code just find for you tho.

    <code>
    DataGrid dg = new DataGrid();
    dg.DataSource =new DataTable();// (Run some query or whatnot here)
    dg.DataBind

    ArrayList AutoGeneratedColumns
    = (ArrayList) GetPrivateField(dg,"autoGenColumnsArray") ;

    if (AutoGeneratedColumns!= null)
    foreach (DataGridColumn CurrentColumn in AutoGeneratedColumns)
    {
    Response.Write(CurrentColumn.HeaderText);
    }


    public static object GetPrivateField(object PassedObject, string
    FieldName)
    {

    object Field=null;

    if (PassedObject == null)
    throw new ArgumentNullException("PassedObject"
    ,"PassedObject must be an instantiated object.");

    if (FieldName == null || FieldName.Trim() == "")
    throw new ArgumentOutOfRangeException("FieldName"
    ,"Fieldname must be a non empty string.");

    Type ObjectType = PassedObject.GetType();
    System.Reflection.FieldInfo PrivateField =
    ObjectType.GetField(FieldName
    ,System.Reflection.BindingFlags.Instance
    | System.Reflection.BindingFlags.NonPublic
    | System.Reflection.BindingFlags.Public
    | System.Reflection.BindingFlags.IgnoreCase);

    if (PrivateField == null)
    throw new ArgumentOutOfRangeException("FieldName"
    , ObjectType.FullName + " does not have a field : " + FieldName +
    ".");

    Field = PrivateField.GetValue(PassedObject);
    return Field;
    }
    </code>
     
    Jason Coyne Gaijin42, Apr 4, 2004
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jason Coyne  Gaijin42
    Replies:
    0
    Views:
    615
    Jason Coyne Gaijin42
    Apr 2, 2004
  2. Jason Coyne  Gaijin42
    Replies:
    2
    Views:
    644
    Jason Coyne Gaijin42
    Apr 6, 2004
  3. DaveLessnau
    Replies:
    3
    Views:
    428
    Howard
    May 16, 2005
  4. Øyvind Isaksen
    Replies:
    1
    Views:
    980
    Øyvind Isaksen
    May 18, 2007
  5. Edward J. Stembler

    Designtime error when accessing DataGrid Columns collection

    Edward J. Stembler, Oct 17, 2003, in forum: ASP .Net Web Controls
    Replies:
    0
    Views:
    126
    Edward J. Stembler
    Oct 17, 2003
Loading...

Share This Page