2013-09-12 2 views
0

У меня есть datagridview, который получает свои данные из Access через OleDbDataReader.Невозможно установить источник данных datagridview из списка

Проблема заключается в следующем чтения данных в таблице данных, то настройка datasource = dt => работает

dt.Load(dr); 

с ДТ и применение Linq к нему => пустой GridView

GVMultiple.DataSource = (from myRow in dt.AsEnumerable() 
         where myRow.Field<string>("State") == "Succeeded" 
         select myRow) 

делает Linq.ToList() => показывает столбцы с именами «RowError», «RowState», «Таблица» и «hasErrors», которые не являются моими столбцами.

GVMultiple.DataSource = (from myRow in dt.AsEnumerable() 
         where myRow.Field<string>("State") == "Succeeded" 
         select myRow).ToList() 

Чтение данных в Object обычая List then заходящего datasource = List => пустые GridView

while (dr.Read()) 
{ 
    UserList.Add(new UserInfo() 
    { 
     ID = (int)dr["ID"], 
     UserName = (string)dr["User Name"] 
    }); 
} 

GVMultiple.DataSource = UserList 

Может кто-нибудь сказать мне, что происходит?

+0

'ID' и' UserName' являются свойствами или полями? –

+0

Определены следующим образом: класс UserInfo { public int ID; public string UserName; и т. Д. } – AngelicCore

ответ

1

Для того, чтобы сделать работу DataBinding, вы должны использовать Properties. Fields не поддерживает DataBinding.

Измените свой класс, как показано ниже, чтобы он работал.

class UserInfo 
{ 
    public int ID {get;set;} //convert fields to property 
    public string UserName{get;set;} 
} 
+0

Спасибо, это решило одну из проблем. Что касается другой части, где я не могу отфильтровать свой dt с помощью LINQ и установить для него источник данных. – AngelicCore

+1

Не используйте linq. Просто установите DataTable в качестве источника данных и используйте [Фильтр] (http://msdn.microsoft.com/en-us/library/system.data.datatable.defaultview.aspx) –

1

GVMultiple.DataSource = (от myRow в dt.AsEnumerable() где myRow.Field ("Государство") == "Преемник" выберите myRow)

делает Linq.ToList() => показывает столбцы с именами "RowError", "RowState", "Таблица" и "hasErrors", которые не являются мои столбцы

RowError», "RowState", "Таблица" и "hasErrors" являются свойства DataRow - это то, что находится в списке you cr eated.

Ознакомьтесь с методом расширения .CopyToDataTable(). http://msdn.microsoft.com/en-us/library/bb396189.aspx

GVMultiple.DataSource = (from myRow in dt.AsEnumerable() 
        where myRow.Field<string>("State") == "Succeeded" 
        select myRow).CopyToDataTable(); 
0

Причиной этого является то, что вид сетки данных не в состоянии признать сбор новых данных в допустимом формате для отображения.

При использовании запросов Linq для фильтрации данных и повторного отображения их в виде сетки данных вы всегда должны возвращать результат запроса в любой источник данных в виде представления данных.

DataView строит индекс, что значительно увеличивает производительность операций, которые могут использовать индекс, такие как фильтрация и сортировки. Индекс для DataView создается как при создании DataView , так и при изменении любой информации сортировки или фильтрации . Создание DataView, а затем установка сортировки или фильтрующей информации позже приводит к тому, что индекс будет построен не менее дважды: один раз при создании DataView и снова, когда какой-либо из свойств сортировки или фильтра будет изменен.

Например:

DataTable dt = empData.loadEmployee(); 
BindingSource bs = new BindingSource(); 
bs.DataSource = dt.AsEnumerable() 
    .Where(c => c.Field<string>("First Name").ToLower() 
    .Contains(txtSearch.Text.ToLower())).AsDataView(); 

dgvEmpManag.DataSource = bs; 

В примере я ищу сотрудника, с именем, как термин поиска в текстовом поле txtSearch, когда обнаружил, что вид сетки данных будет отображаться фильтруется результаты моего поиска AsDataView() ,

Смежные вопросы