【问题标题】:How to sort dataGridView in descending order by a specific column and rank them?如何按特定列按降序对dataGridView进行排序并对其进行排名?
【发布时间】:2016-04-08 13:05:31
【问题描述】:

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

每个玩家的分数随机输入到数据库中。

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

这是我的表结构

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

感谢任何帮助。

string query1 = "SELECT player_ID'玩家ID',player_name'玩家 Name',player_nick'昵称',HP'High Score' FROM player_profile ORDER 通过 HP DESC";

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

【问题讨论】:

  • 如果您从数据库中获取信息,您可以使用 order by。
  • @KratosMafia 好的...那么如何对它们进行排名?
  • 你不应该假设@tdbeckett 很懒惰。他可能(和我一样)得到的是你应该展示你目前拥有的 C# 代码。我们假设您已经知道如何检索数据,因为您只询问了排序/排名。您寻求的答案取决于您是 a.) 在 C# 中构造查询并发送到数据库、调用存储过程或使用 ORM。 b.) 你在数据库中有什么权限(例如,你能创建一个新的存储过程吗?)事实上,你的问题太开放了。
  • 我本以为答案可能值得一票,尤其是考虑到您最初得到的帮助很少

标签: c# mysql sorting datagridview


【解决方案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;
}

结果:

表中没有Rank列,是通过上面的SQL语句添加的。

如果你有关系,事情就会变得更加复杂。您必须引入一些其他变量来跟踪 HP/Score 何时更改并仅在那时增加 @rank。如果您想跳过平局排名({1,2,2,4} 与 {1,2,2,3}),您还必须添加一个计数器。

一件事是您必须允许可以在连接字符串中指定的用户变量:

Server=SvrAddr;Database=myDB;Uid=myUsr;Pwd=myPass;Allow User Variables=True";

根据Connection Strings,该选项自版本 5.2.2 起可用


This Great Answer 显示如何跳过必须初始化 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 可以避免显式声明它。很酷。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2012-02-12
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多