Search code examples
c#datagridcompact-frameworkbindingsourcedatagridtablestyle

How do you get the proper mapping name from a binding source bound to a List<T>, or an anonymous type, to use on a DataGridTableStyle?


I'm trying to create a DataGridTableStyle object so that I can control the column widths of a DataGrid. I've created a BindingSource object bound to a List. Actually it's bound to an anonymous type list created though Linq in the following manner (variable names changed for clarity of what I'm doing):

List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query;
myDataGrid.DataSource = myBindingSource;

Then I create a DataGridTableStyle object and add it to the datagrid. However, it never applies my table style properties I set up because I can't seem set the proper myDataGridTableStyle.MappingName property.

I've searched Google for about 1/2 an hour and keep seeing links to the same question throughout a bunch of different forums (literally the same text, like someone just copied and pasted the question... I hate that...). Anyway, none of the suggestions work, just like the guy says on all the other sites.

So does anybody here know what I need to set the MappingName property to in order to have my TableStyle actually work properly? Where can I grab the name from? (It can't be blank... that only works with a BindingSource that is bound to a DataTable or SqlCeResultSet etc.).

I'm thinking it could be an issue with me using Linq to create an anonymous, more specialized version of the objects with only the fields I need. Should I just try to bind the BindingSource directly to the List object? Or maybe even bind the DataGrid directly to the List object and skip the binding source altogether.

Thanks

PS - C#, Compact Framework v3.5

UPDATE:

I've posted an answer below that solved my problem. Whether or not it's the best approach, it did work. Worth a peek if you're having the same issue I had.


Solution

  • I've found the way to make this work. I'll break it out into sections...


    List<myType> myList = new List<myType>(someCapacity);
    .
    ...populate the list with query from database...
    .
    

    DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
    DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
    DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
    DataGridTextBoxColumn colC = new DataGridTextBoxColumn();
    
    colA.MappingName = "FieldA";
    colA.HeaderText = "Field A";
    colA.Width = 50; // or whatever;
    
    colB.MappingName = "FieldB";
    .
    ... etc. (lather, rinse, repeat for each column I want)
    .
    
    myDataGridTableStyle.GridColumnStyles.Add(colA);
    myDataGridTableStyle.GridColumnStyles.Add(colB);
    myDataGridTableStyle.GridColumnStyles.Add(colC);
    

    var query = from i in myList
                select new
                {
                    i.FieldA,
                    i.FieldB,
                    i.FieldC
                };
    
    myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell
    
    // wasn't sure what else to pass in here, but null worked.
    myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 
    
    myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
    myDataGrid.TablesStyles.Add(myDataGridTableStyle);
    myDataGrid.DataSource = myBindingSource;
    

    So basically, the DataGridTableStyle.MappingName needs to know what type of object it is mapping to. Since my object is an anonymous type (created with Linq), I don't know what it is until runtime. After I bind the list of the anonymous type to the binding source, I can use BindingSource.GetListName(null) to get the string representation of the anonymous type.

    One thing to note. If I just bound the myList (which is type "myType") directly to the binding source, I could have just used the string "myType" as the value for DataGridTableStyle.MappingName.

    Hopefully this is useful to other people!