2014-09-09 4 views
0

Я использую DataGridView в зеркало моей таблицы SQL с помощью LINQ так:C# DataGridView, показать столбцы, только данные

var listOfCarRecords = dataGridView1.DataSource = record.Select(x => Mapper.Map<Cars>(x)).ToList(); 

Это прекрасно работает.

Однако моя таблица sql имеет 60 столбцов, из которых только некоторые из них содержат данные, есть несколько случаев, когда все содержат данные.

Как я могу показать только столбцы с данными в моем datagridview?

Я попытался установить autogeneratecolumns = false, но это не сработало.

Какой простейший способ сделать это, пожалуйста?

спасибо

+0

Как вы знаете столбец содержит данные или нет? Что вы имеете в виду, это данные? Btw вы можете установить 'AutoGenerateColumns = false' и вручную добавить столбцы. –

+0

Я могу видеть в моей фактической таблице sql только некоторые столбцы имеют данные. Я попытался установить autogeneratecolumns = false, но это не сработало. – CaughtInALoop

+0

Каков тип 'listOfCarRecords'? Опубликовать определение класса 'T' –

ответ

1

Перед назначением Datatable в качестве источника данных, вы можете удалить столбцы, которые имеют нулевые значения.

if (table.AsEnumerable().All(dr => dr.IsNull("ColumnName"))) // column name having null values 
    table.Columns.Remove("ColumnName"); 

, а затем назначить его в DataGridView

datagridview1.DataSource = table; 

EDIT:

DataTable dataTable = record.Select(...) // Your data coming from DB 

// Remove Empty Columns 
if (dataTable.AsEnumerable().All(dr => dr.IsNull("ColumnName"))) // column name having null values 
    dataTable.Columns.Remove("ColumnName"); 


List<Cars> listOfCarRecords = dataTable.ToCollection<Cars>; 
dataGridView1.DataSource = listOfCarRecords; 


// ToCollection is an extension methods for converting generic class to List 
public static List<T> ToCollection<T>(this DataTable sourceDatatable) 
{ 
    var lst = new List<T>(); 

    Type tClass = typeof(T); 
    PropertyInfo[] pClass = tClass.GetProperties(); 
    List<DataColumn> dc = sourceDatatable.Columns.Cast<DataColumn>().ToList(); 

    foreach (DataRow item in sourceDatatable.Rows) 
    { 
    var genericObject = (T)Activator.CreateInstance(tClass); 
    foreach (PropertyInfo pc in pClass) 
    { 
     DataColumn d = dc.Find(c => c.ColumnName == pc.Name); 
     if (d != null) 
      pc.SetValue(genericObject, item[pc.Name], null); 
    } 
    lst.Add(genericObject); 
    } 
    return lst; 
} 
+0

, можете ли вы привести пример того, что вы имеете в виду, используя мой собственный код: var listOfCarRecords = dataGridView1.DataSource = record.Select (x => Mapper.Map (х)) ToList(). спасибо – CaughtInALoop

+0

Кажется, вы используете AutoMapper для сопоставления своего класса с List. Я никогда не использовал его, но я обновил свой ответ на ваши требования. Я использую методы расширения для преобразования DataTable в список классов – Pankaj

+0

спасибо за ваши усилия, но есть ли более простой способ? – CaughtInALoop

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