[英]Sorting N-digit numbers with Sort Method in dataGridview in C# not working
I have a dataGridview with some information.我有一个包含一些信息的 dataGridview。 I will sort the rows to T(Period) .我会将行排序为T(Period) 。 I want the result to be: ACBD .我希望结果是: ACBD 。
But this method is not working.但是这个方法行不通。 It seems that only the first digit is compared.似乎只比较了第一个数字。 I have no idea what to do.我不知道该怎么做。
Thanks for any help.谢谢你的帮助。
dataGridView1.Sort(dataGridView1.Columns[2], ListSortDirection.Ascending);
if (openFile.ShowDialog() == DialogResult.OK)
{
var items = File.ReadLines(openFile.FileName).Select(line => line.Trim().Split(' '));
DataTable dt = new DataTable();
foreach (var line in items)
{
while (line.Length > dt.Columns.Count)
dt.Columns.Add(new DataColumn($"Column {dt.Columns.Count}", typeof(string)));
dt.Rows.Add(line);
}
dataGridView1.DataSource = dt;
/////////////////////////
dataGridView1.Columns[0].HeaderCell.Value = "Tasks";
dataGridView1.Columns[1].HeaderCell.Value = "Computation Time";
dataGridView1.Columns[2].HeaderCell.Value = "T (Period)";
dataGridView1.Columns[3].HeaderCell.Value = "Deadline";
dataGridView1.Sort(dataGridView1.Columns[2], ListSortDirection.Ascending);
}
I read the data from a txt file like below:我从一个txt文件中读取数据,如下所示:
A 1 3 3
B 1 6 6
C 1 5 5
D 2 10 9
You need to set the columns with integers as a typeof(int)
to get the proper sorting of integer values instead of string values.您需要将带有整数的列设置为typeof(int)
以获得整数值而不是字符串值的正确排序。 Example…例子…
if (openFile.ShowDialog() == DialogResult.OK) {
DataTable dt = new DataTable();
dt.Columns.Add("Tasks", typeof(string));
dt.Columns.Add("Comparison Time", typeof(int));
dt.Columns.Add("T (Period)", typeof(int));
dt.Columns.Add("Deadline", typeof(int));
var items = File.ReadLines(openFile.FileName).Select(line => line.Trim().Split(' '));
foreach (var line in items) {
dt.Rows.Add(line);
}
dataGridView1.DataSource = dt;
dataGridView1.Sort(dataGridView1.Columns[2], ListSortDirection.Ascending);
}
You can implement a custom sorter like below :您可以实现如下自定义排序器:
private class RowComparer : System.Collections.IComparer
{
private static int sortOrderModifier = 1;
public RowComparer(ListSortDirection sortOrder)
{
if (sortOrder == ListSortDirection.Descending)
{
sortOrderModifier = -1;
}
else if (sortOrder == ListSortDirection.Ascending)
{
sortOrderModifier = 1;
}
}
public int Compare(object x, object y)
{
var DataGridViewRow1 = (DataGridViewRow)x;
var DataGridViewRow2 = (DataGridViewRow)y;
// Try to sort based on the Last Name column.
int CompareResult = int.Parse(
DataGridViewRow1.Cells[2].Value.ToString()
).CompareTo(int.Parse(
DataGridViewRow2.Cells[2].Value.ToString()));
return CompareResult * sortOrderModifier;
}
}
And then use it like :然后像这样使用它:
dataGridView1.Sort(new RowComparer(ListSortDirection.Ascending));
You can extend the row compare by accepting more parameters and implement it more generic way.您可以通过接受更多参数并以更通用的方式实现它来扩展行比较。 Above example is derived from here .上面的例子来自here 。 Check it out for further reading.检查出来进一步阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.