【问题标题】:Sorting DataTable column is not working in C#排序 DataTable 列在 C# 中不起作用
【发布时间】:2017-08-11 15:49:57
【问题描述】:

我是 C# 新手,我正在使用 Windows 窗体。

我有Form1,其中有buttonDatagridviewflowLayoutPanel。我在 SQL 中有大型地址表(400,000 条记录)我正在尝试根据特定给定的邮政编码导入门牌号码,然后将这些号码分配给按钮文本,如下所示:

     SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
     SqlCommand MySQLCommand = new SqlCommand();
     DataTable Data_Table1 = new DataTable();
     SqlDataAdapter SQLDataAdapter = new SqlDataAdapter();


  private void button1_Click(object sender, EventArgs e)
    {

        string PostCode = "L8 8HN";

        Data_Table1.Rows.Clear();
        Data_Table1.Columns.Clear();  
        MyConnection.Open();          
        MySQLCommand.CommandText = "SELECT * FROM PC where Postcode= '" + PostCode + "'";

        MySQLCommand.Connection = MyConnection;
        SQLDataAdapter.SelectCommand = MySQLCommand;
        SQLDataAdapter.Fill(Data_Table1);
        MySQLCommand.Parameters.Clear();
        SQLDataAdapter.Dispose();
        MyConnection.Close();


        // Sort the "Building Number" column. 
        DataTable dt2 = Data_Table1.Clone();
        dt2.Columns["Building Number"].DataType =    Type.GetType("System.Int32");
        foreach (DataRow dr in Data_Table1.Rows)
        {
            dt2.ImportRow(dr);
        }
        dt2.AcceptChanges();
        DataView dv = dt2.DefaultView;
        dv.Sort = "Building Number ASC";


        //Create buttons and make Building Number as text.
       int RowIndex = dt2.Rows.Count - 1;
        for (int i = 0; i <= RowIndex; i++)
        {
            Button btn = new Button();
            btn.Text = dt2.Rows[i]["Building Number"].ToString();
            btn.Width = 50;
            btn.Height = 50;        
            flowLayoutPanel1.Controls.Add(btn);
        }

        // check if the column "Building Number" is sorted or not.
        dataGridView1.DataSource = dt2;

}

当我点击button1 时,SQL 查询会根据给定的邮政编码获取所有建筑编号,然后对建筑编号进行排序,然后创建新按钮并根据建筑编号制作其文本,同时显示dt2datagridview

  • 问题:

如屏幕截图所示,datagridview 中的“Building Number”列按我想要的方式排序,但是当我循环抛出dt2 并从dt2 分配buttons 文本时,在本例中为@987654337 @ 没有以正确的方式排序。 按钮应该按照datagridview中的正确方式排序

请注意,SQL 表中的“Building Number”列是字符串类型。另外我使用datagridview 只是为了查看该列是否已排序。

我查看了hereherehere,但它们都没有帮助我。

如果有人知道我怎样才能以正确的方式从 1、2、3、4、5、6、7 开始排序这些按钮...

谢谢

【问题讨论】:

  • 你在动态创建按钮吗?
  • @J.SMTBCJ15。是的

标签: c# ado.net


【解决方案1】:

您正在创建一个有序的DataView,但在创建按钮的循环中,您使用的是无序的dt2。您应该将该循环更改为:

for (int i = 0; i <= RowIndex; i++)
{
    Button btn = new Button();
    btn.Text = dv[i]["Building Number"].ToString();
    btn.Width = 50;
    btn.Height = 50;        
    flowLayoutPanel1.Controls.Add(btn);
}

作为一个更好的选择,而不是您为数据排序所经历的所有步骤,为什么不在您的 sql 查询中得到已经排序的数据?

MySQLCommand.CommandText = "SELECT * FROM PC where Postcode= '" + PostCode + "' order by Building Number";

我还建议您使用参数化查询而不是连接字符串以避免 SQL 注入

【讨论】:

  • 准备好的陈述!
  • 这是带有一点魔法的终极解决方案。谢谢
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多