заголовки строк в datatable - для отображения в сетке данных - PullRequest
6 голосов
/ 07 мая 2011

Есть ли способ хранить информацию заголовка строки в таблице данных, чтобы, когда я связываю ее с сеткой данных, она автоматически отображала заголовки столбцов и строк в c #?

Ответы [ 2 ]

5 голосов
/ 16 февраля 2013

Linqpad Демонстрационная программа

Насколько я понял, вы хотели бы добавить имя столбца в качестве значений в datatable / datagridview. Ниже приведена Linqpad -программа, которую вы можете легко скопировать вставить в Linqpad для воспроизведения. Код добавляет имена столбцов в первую строку в таблицу данных. Вы можете легко связать этот набор данных с видом сетки, но имейте в виду, что каждый столбец таблицы данных должен иметь тип string.

void Main()
{
    GetDataTable().Dump();
}

public DataTable GetDataTable()
{
    var dt = new DataTable();   
    dt.Columns.Add("Id", typeof(string)); // dt.Columns.Add("Id", typeof(int));
    dt.Columns["Id"].Caption ="my id";  
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Job", typeof(string));
    dt.Rows.Add(GetHeaders(dt));
    dt.Rows.Add(1, "Janeway", "Captain");
    dt.Rows.Add(2, "Seven Of Nine", "nobody knows");
    dt.Rows.Add(3, "Doctor", "Medical Officer");
    return dt;
}

public DataRow GetHeaders(DataTable dt)
{
    DataRow dataRow = dt.NewRow();      
    string[] columnNames = dt.Columns.Cast<DataColumn>()
                                 .Select(x => x.ColumnName)
                                 .ToArray();    
    columnNames.Dump();
    dataRow.ItemArray = columnNames;
    return dataRow;
}

Result of Linqpad programm

Обновление 2019-06 с дополнительным пояснением и альтернативным кодом

Метод GetHeaders - не самый простой способ получить заголовки. Ранее метод расширения Cast<TResult>(IEnumerable) использовался в DataColumnCollection-Class Альтернативой было бы просто выполнить итерацию по коллекции - это то, что делается в GetHeadersNew T

public DataRow GetHeadersNew(DataTable dt)
{
    DataRow row = dt.NewRow();      
    DataColumnCollection columns = dt.Columns;
    for (int i = 0 ;i <columns.Count ;i++)
    {
         row[i] = columns[i].ColumnName;
    }       
    return row;
}

Это, вероятно, более эффективно, потому что задействовано меньше объектов и методов.

3 голосов
/ 07 мая 2011

Пока вы можете создавать их с помощью кода, основанного на данных в строке, я бы просто добавил их во время выполнения, используя c #. Добавьте столбец в таблицу данных и пропустите его с помощью цикла foreach. Пока не слишком много строк, этот код будет выполняться очень быстро:

DataTable dt = new DataTable();
// code here to get your datatable
dt.Columns.Add("rowheader");
foreach (DataRow r in dt.Rows)
{
    r["rowheader"] = "my nice row header";
}

Затем выведите новый столбец rowheader в качестве первой ячейки в сетке.

Другое решение - использовать SQL-запрос для возврата «лишнего» столбца в наборе результатов. например:

Select *, 'my nice row header' as rowheader from myTable

Таким образом, вы заставляете SQL делать всю работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...