我有一个有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行,但排序不起作用。我还尝试使用LINQ
(How to sort DataTable based on multiple column?)并检查了此趋势(DataTable.DefaultView.Sort Doesn't Sort),但没有一个有效。
我做错了吗?非常感谢任何帮助。
答案 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;
}