繁体   English   中英

如何按特定列的降序对dataGridView进行排序并对它们进行排名?

[英]How to sort dataGridView in descending order by a specific column and rank them?

我正在尝试根据玩家的高分创建排行榜。

每个玩家的分数将随机输入到DB中。

我需要根据他们的高分对它们进行排序,并对它们进行排名。

这是我的表结构 在此处输入图片说明

在这里,我想在datagridview中显示player_ID,player_name,player_nick和HP。

任何帮助表示赞赏。

字符串查询1 =“ SELECT player_ID'玩家ID',player_name'玩家名称',player_nick'昵称',HP'高分'FROM player_profile ORDER BY HP DESC”;

到目前为止我的工作,我不知道如何排名

以下代码将数据添加到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM