如何在这个C#程序中打印列名?

76

我拼凑出了一个C#程序,它可以将.csv文件写入一个DataTable。使用这个程序,我可以循环遍历DataTable中的每一行,并打印出行中包含的信息。控制台输出如下:

--- Row ---
Item: 1
Item: 545
Item: 507
Item: 484
Item: 501

我想同时打印每个值旁边的列名,使它看起来像这样:

--- Row ---
Item: 1   Hour
Item: 545 Day1 KW
Item: 507 Day2 KW
Item: 484 Day3 KW
Item: 501 Day4 KW

可以有人看一下我的代码,告诉我该添加什么才能打印出列名?我非常新手C#,如果我忽略了什么,请原谅。

下面是我的代码:

// Write load_forecast data to datatable.
DataTable loadDT = new DataTable();
StreamReader sr = new StreamReader(@"c:\load_forecast.csv");                      

string[] headers = sr.ReadLine().Split(',');
foreach (string header in headers)
{
    loadDT.Columns.Add(header); // I've added the column headers here.
}

while (sr.Peek() > 0)
{
    DataRow loadDR = loadDT.NewRow();
    loadDR.ItemArray = sr.ReadLine().Split(',');
    loadDT.Rows.Add(loadDR);
}

foreach (DataRow row in loadDT.Rows)
{
    Console.WriteLine("--- Row ---");
    foreach (var item in row.ItemArray)
    {
        Console.Write("Item:");
        Console.WriteLine(item); // Can I add something here to also print the column names?
    }
}
5个回答

129
你需要循环遍历loadDT.Columns,像这样:
foreach (DataColumn column in loadDT.Columns)
{
    Console.Write("Item: ");
    Console.Write(column.ColumnName);
    Console.Write(" ");
    Console.WriteLine(row[column]);
}

我理解一下,这个循环遍历loadDT.Columns应该在loadDT.Rows的循环内部吗? - Kevin
1
@Kevin:是的,你的第一个循环是针对.Rows的,第二个是针对.Columns的,然后你就可以引用row[column.ColumnName]访问当前行中每一列的值了。 - Ahmad Mageed
谢谢,Ahmad!我非常感激! - Kevin
哈哈,我只是好奇,也许有人能理解为什么在这个例子中使用var而不是DataColumn不起作用?据我所知,由于varforeach的语义,它应该可以工作。 - hellouworld
2
@hellouworld:因为DataColumnCollection没有实现IEnumerable<T>,所以没有强类型的枚举器供var推断类型。(这个类早于泛型的存在) - SLaks
这个例子给了我一个错误提示:"foreach语句无法对类型为'DataTable'的变量进行操作,因为'DataTable'不包含公共实例或扩展定义'GetEnumerator'"。尝试使用var创建我的DataTable,但得到了相同的结果?(我的问题是漏掉了".columns"),只使用forEach(DataColumn column in LoadDt)。 - David Mays

35
foreach (DataRow row in dt.Rows)
{
    foreach (DataColumn column in dt.Columns)
    {
        ColumnName = column.ColumnName;
        ColumnData = row[column].ToString();
    }
}

运行得像魔法一样。 - Garry

5
如果您不想遍历所有列,也可以像这样专门访问列名:

3

查找与SQL中使用Like相同的列名的代码。

foreach (DataGridViewColumn column in GrdMarkBook.Columns)  
                      //GrdMarkBook is Data Grid name
{                      
    string HeaderName = column.HeaderText.ToString();

    //  This line Used for find any Column Have Name With Exam

    if (column.HeaderText.ToString().ToUpper().Contains("EXAM"))
    {
        int CoumnNo = column.Index;
    }
}

2
打印带有列名的数据表行
Here is solution 

DataTable datatableinfo= new DataTable();

// Fill data table 

//datatableinfo=fill by function or get data from database

//Print data table with rows and column


for (int j = 0; j < datatableinfo.Rows.Count; j++)
{
    for (int i = 0; i < datatableinfo.Columns.Count; i++)    
        {    
            Console.Write(datatableinfo.Columns[i].ColumnName + " ");    
            Console.WriteLine(datatableinfo.Rows[j].ItemArray[i]+" "); 
        }
}


Ouput :
ColumnName - row Value
ColumnName - row Value
ColumnName - row Value
ColumnName - row Value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接