选择数据表中的特定列。

31

我有一个数据表格,想知道是否可以选择特定的列并将数据输入到表格中。这些列如下所示:

|col1 |col2 |col3|col4 |col5 |col6|col7 |col8 |col9 |col10 |col11 |

我想选择列col1、col2、col6、col7和col3,并在数据表格内以网格视图显示行数据。目前我正在使用的代码只选择了某些数据。我没有从 SQL 中选择数据,而是从存储在数据表格中的另一个 Excel 文件中选择的数据。但是我还需要另一个区域中的其他列,这些数据被写入到 Word 表格中。

 for (int i = 1; i < table.Rows.Count; i++)
            {
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    if (j == 0)
                    {
                        val = filteredData.Rows[row][col].ToString();
                    }
                    else
                    {
                        val = filteredData.Rows[row][col].ToString();

                        if (val == "-" || val == "")
                        {
                            val = filteredData.Rows[row][col].ToString();

                        }
                        else
                        {
                            val = Convert.ToString(Math.Round(Convert.ToDouble(filteredData.Rows[row][col]), MidpointRounding.AwayFromZero));

                        }
                    }

                    table[j, i].TextFrame.Text = val;
                    col++;
                }

为什么你不试试 dt.Columns.Remove("column_name") 呢? - Anujith
我已经尝试过了,但是在下一部分中我需要其他列。 - Jim Brad
6个回答

64

我们也可以尝试这样做,

 string[] selectedColumns = new[] { "Column1","Column2"};

 DataTable dt= new DataView(fromDataTable).ToTable(false, selectedColumns);

2
这正是我需要的,用于我已经设计好的MVC控制器,以便拥有一个selectedCol字符串数组。 - bkwdesign
这不就是 MrFox 发布的完全一样吗?唯一的区别是你还创建了 selectedColumns 数组,它只被使用了一次,从 2 行变成了 1 行。 - Gondil
性能方面,它比那个查询更好,并且对于多列表进行了优化的代码也更好。 - Ramkumar Srinivasan

37

先将表存储在一个视图中,然后从该视图选择列到一个新表中。

// Create a table with abitrary columns for use with the example
System.Data.DataTable table = new System.Data.DataTable();
for (int i = 1; i <= 11; i++)
    table.Columns.Add("col" + i.ToString());

// Load the table with contrived data
for (int i = 0; i < 100; i++)
{
    System.Data.DataRow row = table.NewRow();
    for (int j = 0; j < 11; j++)
        row[j] = i.ToString() + ", " + j.ToString();
    table.Rows.Add(row);
}

// Create the DataView of the DataTable
System.Data.DataView view = new System.Data.DataView(table);
// Create a new DataTable from the DataView with just the columns desired - and in the order desired
System.Data.DataTable selected = view.ToTable("Selected", false, "col1", "col2", "col6", "col7", "col3");

我使用示例数据测试了这个方法,我发现:创建只显示选定列的ADO.NET DataView


1
这是一个与匿名输出记录相关的工作示例,如果您有任何问题,请在下面评论区留言。
public partial class Form1 : Form
{
    DataTable table;
    public Form1()
    {
        InitializeComponent();
        #region TestData
        table = new DataTable();
        table.Clear();
        for (int i = 1; i < 12; ++i)
            table.Columns.Add("Col" + i);
        for (int rowIndex = 0; rowIndex < 5; ++rowIndex)
        {
            DataRow row = table.NewRow();
            for (int i = 0; i < table.Columns.Count; ++i)
                row[i] = String.Format("row:{0},col:{1}", rowIndex, i);
            table.Rows.Add(row);
        }
        #endregion
        bind();
    }

    public void bind()
    {
        var filtered = from t in table.AsEnumerable()
                       select new
                       {
                           col1 = t.Field<string>(0),//column of index 0 = "Col1"
                           col2 = t.Field<string>(1),//column of index 1 = "Col2"
                           col3 = t.Field<string>(5),//column of index 5 = "Col6"
                           col4 = t.Field<string>(6),//column of index 6 = "Col7"
                           col5 = t.Field<string>(4),//column of index 4 = "Col3"
                       };
        filteredData.AutoGenerateColumns = true;
        filteredData.DataSource = filtered.ToList();
    }
}

1
我想问的问题是,如果这些额外的列不是必需的,为什么要在您的DataTable中包含它们?
也许您应该修改SQL选择语句,以便在填充DataTable时查看您正在寻找的特定条件。
您还可以使用LINQ查询您的DataTable作为Enumerable,并创建一个表示仅某些列的List对象。
除此之外,隐藏您不需要的DataGridView列。

@Derek 可以在选择语句中添加条件吗? - Smith

0
你可以创建一个类似这样的方法:
  public static DataTable SelectedColumns(DataTable RecordDT_, string col1, string col2)
    {
        DataTable TempTable = RecordDT_;

        System.Data.DataView view = new System.Data.DataView(TempTable);
        System.Data.DataTable selected = view.ToTable("Selected", false, col1, col2);
        return selected;
    }

您可以尽可能返回多列...只需将列作为调用参数添加,如下所示:
public DataTable SelectedColumns(DataTable RecordDT_, string col1, string col2,string col3,...)

并且将参数添加到这一行:

System.Data.DataTable selected = view.ToTable("Selected", false,col1, col2,col3,...);

然后只需按照以下方式实现该函数:

 DataTable myselectedColumnTable=SelectedColumns(OriginalTable,"Col1","Col2",...);

谢谢...


-1
DataView dv = new DataView(Your DataTable);

DataTable dt = dv.ToTable(true, "Your Specific Column Name");

dt仅包含所选列的值。


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