[英]How to sort dataGridView in descending order by a specific column and rank them?
以下代码将数据添加到dataGridView,然后最后回答您的问题。
// Add columns to the dataGridView
dataGridView1.Columns.Add("player_ID", "player_ID");
dataGridView1.Columns.Add("player_name", "player_name");
dataGridView1.Columns.Add("player_nick", "player_nick");
dataGridView1.Columns.Add("HP", "HP");
// Add some data to the dataGridView
object[] rowData = new object[dataGridView1.Columns.Count];
rowData[0] = 0; // Player_ID
rowData[1] = "Pancho"; // Player_Name
rowData[2] = "Speedy"; // Player Nick
rowData[3] = Convert.ToDecimal("58.7"); // HP
dataGridView1.Rows.Add(rowData);
rowData[0] = 1;
rowData[1] = "Ramon";
rowData[2] = "Sleepy";
rowData[3] = Convert.ToDecimal("39.6"); // HP
dataGridView1.Rows.Add(rowData);
rowData[0] = 2;
rowData[1] = "Cimitrio";
rowData[2] = "Grumpy";
rowData[3] = Convert.ToDecimal("41.2"); // HP
dataGridView1.Rows.Add(rowData);
rowData[0] = 3; // Player_ID
rowData[1] = "Panfilo"; // Player_Name
rowData[2] = "Gummy Bear"; // Player Nick
rowData[3] = Convert.ToDecimal("61.5"); // HP
dataGridView1.Rows.Add(rowData);
// Sort dataGridView by HP
dataGridView1.Sort(dataGridView1.Columns[3], ListSortDirection.Ascending);
// Add rank column
dataGridView1.Columns.Add("Rank", "Rank");
// Rank players
for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
{
dataGridView1.Rows[i].Cells["Rank"].Value = Convert.ToString(i+1);
}
您可以使用SQL为等级提供用户变量(我认为也有一些Rank()函数)。 从像Workbench这样的东西:
SET @rank=0;
SELECT Name, HP, @rank:=@rank+1 As Rank FROM Demo ORDER BY HP ASC
您也可以从代码中进行一点改动:
string SQL = @"SET @rank=0;
SELECT Name, HP, StartDate, @rank:=@rank+1 As Rank
FROM Demo ORDER BY HP DESC;";
using (MySqlConnection dbcon = mySqlDB.GetMySQLConnection())
using (MySqlCommand cmd = new MySqlCommand(SQL,dbcon))
{
dbcon.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
dgv1.DataSource = dt;
}
结果:
表中没有排名列,该列是通过上面的SQL语句添加的。
如果有联系,它将变得更加复杂。 您必须引入其他变量来跟踪HP / Score何时更改,然后才递增@rank。 如果要跳过平局的等级({1,2,2,4}与{1,2,2,3}),则还必须添加一个计数器。
一件事是,您必须允许可以在连接字符串中指定的用户变量:
Server=SvrAddr;Database=myDB;Uid=myUsr;Pwd=myPass;Allow User Variables=True";
根据连接字符串,此选项自版本5.2.2起可用
这个好答案显示了如何跳过必须初始化rank
var的情况:
string SQL = @"SELECT Name, HP, StartDate, @rank:=@rank+1 As Rank
FROM Demo, (SELECT @rank := 0) r ORDER BY HP DESC;";
添加(SELECT @rank := 0) r
无需显式声明它。 很酷。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.