.Net DataTables can be very useful when writing data-driven applications. However, they have one limitation: There is no obvious way to databind a grid (or other control) to an arbitrary list of datarows from a table.
You can bind to an entire table directly by setting a DataSource to the DataTable itself, and you can bind to a subset of a table by creating a DataView with a filter.
In general, you cannot bind to an IEnumerable<T>
(eg, a LINQ query); the databinding infrastructure can only handle an IList
(non-generic) or an IListSource
. This is true for any kind of datasource. Therefore, to bind to any LINQ query, you need to call .ToList()
. (Or .ToArray()
)
However, when binding to a DataTable, you can’t even use a List<DataRow>
. If you try, you’ll get four columns (RowError, RowState, Table, and HasErrors) and no useful information. This happens because the List<DataRow>
doesn’t tell the databinding infrastructure about the special properties of the DataRows. To understand the problem, some background is necessary
Databinding is controlled by the ListBindingHelper and TypeDescriptor classes. When you bind to a list, the ListBindingHelper.GetListItemProperties method is called to get the columns in the list. If the list implements the ITypedList
interface, its GetItemProperties
method is called. Otherwise, it will use TypeDescriptor to get the properties of the first item in the list. (this uses reflection)
The DataView class (which DataTable also binds through, using IListSource
) implements ITypedList
and returns DataColumnPropertyDescriptors that expose the columns in the table. This is why you can bind to a DataView or DataTable and see columns. However, when you bind to a List<DataRow>
, there is no ITypedList
that can return the columns as properties. It therefore falls back on reflection and shows the physical properties of the DataRow
class.
To solve this issue, you need to wrap the list in a DataView so that you can take advantage of its ITypedList
implementation. You can do that using the AsDataView()
method. This method is only available on the DataTable
and EnumerableRowCollection<T>
classes; it cannot be called on an arbitrary LINQ query. You can only get an EnumerableRowCollection<T>
by calling special versions of the Cast, OrderBy, Where, and Select methods from a DataTable.
Therefore, you can databind to a simple LINQ query by calling AsDataView()
on the query. To bind to a List<DataRow>
, or to a more complicated query, you can use an ugly hack:
List<DataRow> list = ...; grid.DataSource = table.AsEnumerable() .Where(list.Contains) .AsDataView();
The AsEnumerable()
call is not needed for typed datasets.
You can also call CopyToDataTable()
, which will works on an arbitrary IEnumerable<DataRow>
. However, it makes deep copies of the rows, so it isn’t helpful if you want the user to update the data, or if you want the user to see changes made (in code) to the original datarows.
10 comments:
Wish Google would have found this post three hours ago! Your post not only solved a practical problem, but also provided an informative lesson on binding to lists of datarows. Thank you!
great post!
I've been struggling with this for a few hours and now I finally get it. Thanks a lot =D
You can always use these helpful advices in order to get high quality research paper introduction. I had such experience so I know what I am talking about
شركة نقل اثاث من الرياض الى الدمام
شركة شحن عفش من الرياض الى الامارات
شركة نقل اثاث من الرياض الى حائل شركة نقل اثاث من الرياض الى حائل
شركة تركيب جبس بورد بالرياض شركة تركيب جبس بورد بالرياض
شركة تركيب طارد الحمام بالرياضشركة تركيب طارد الحمام بالرياضمعلم دهانات بالرياض معلم دهانات بالرياض
فني تركيب ورق جدران بالرياض فني تركيب ورق جدران بالرياض
شركة دهان ابواب خشب بالرياض
Thanks For This Great Article. May You Bring This More in Future. Mplyrics
mr jatt Mp3 New Punjabi Song,Single Tracks Latest song download also Listen Latest Music Albums Online in High Quality at Mrpendus.in
mr jatt
mr jatt Mp3 New Punjabi Song,Single Tracks Latest song download also Listen Latest Music Albums Online in High Quality at Mrpendus.in
mr jatt
Dear author, data binding infrastructure is somewhat difficult to understand.. can you explain its concepts more on your posts. Bcz you have a great grasp on the subject matter, and its easy to connect with it. I will be back really.. Best Online gaming in singapore, best crispy thin waffle maker
Binding to DataRow lists simplifies data management, allowing dynamic interactions and cleaner code structures. This binding method simplifies data-driven applications and simplifies data manipulation within various contexts. Divorcio Colaborativo Nueva York
To do that, we create a connection string object to connect the database with the application and read data from the database using the select command to display data in the Dropdowns. CV Writing Services in UAE Says:A ll you have to do is implement and hook it up to your requirements or needs.
Post a Comment