如何对数据表进行排序并保留主键?

时间:2016-03-19 15:04:21

标签: c# sorting datatable primary-key

我有一个有6列的数据表(dt)(S1,S2,S3为string,D1,D2,D3为double)。 string列(S1,S2,S3)的组合构成了我的PrimaryKey:

dt.PrimaryKey = new DataColumn[] 
{ dt.Columns["S1"], dt.Columns["S2"], dt.Columns["S3"] };

现在,我想通过D1,D2,D3对dt进行排序并将其保存为数据表。 这是我得到的:

DataView view = new DataView(dt);
view.Sort = "D1, D2, D3";
dt = view.ToTable();

问题是dt按照我想要的方式排序,因为我丢失了我的PrimaryKeys。我试图用保留PrimaryKeys的dt = view.Table.Copy();替换第3行,但排序不起作用。我还尝试使用LINQHow to sort DataTable based on multiple column?)并检查了此趋势(DataTable.DefaultView.Sort Doesn't Sort),但没有一个有效。

我做错了吗?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

每个DataTable都有一个DefaultView属性,允许您设置排序而不创建主表的副本。

如果将DefaultView.Sort属性设置为您想要的排序顺序,然后遍历DefaultView而不是DataTable,则按照所需的确切顺序获取行

dt.DefaultView.Sort = "D1, D2, D3";
foreach(DataRowView dr in dt.DefaultView)
   Console.WriteLine("D1=" + dr["D1"].ToString() + 
                   ", D2=" + dr["D2"].ToString() + 
                   ", D3=" + dr["D3"].ToString());

如果您仍想创建新表,则需要在新表中重新创建主键列.....

//Get the primarykey column names
List<string> names = dt.PrimaryKey
                       .Cast<DataColumn>()
                       .Select(x => x.ColumnName)
                       .ToList();
// New table
DataTable dt2 = dt.Copy();
// Get the array of datacolumns that match the name of the other table primary
DataColumn[] keys = dt2.Columns
                       .Cast<DataColumn>()
                       .Where(x => names.Contains(x.ColumnName))
                       .ToArray();

// Set the primary in the copied table
dt2.PrimaryKey = keys;

答案 1 :(得分:0)

更短的方法是:

Bitmap GetComposite(Control ctl)
{
    Bitmap bmp = new Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height,
                            PixelFormat.Format32bppArgb);
    ctl.DrawToBitmap(bmp, ctl.ClientRectangle);
    return bmp;
}