排序DataTable列在C#中不起作用

时间:2017-03-20 11:26:11

标签: c# ado.net

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

Form1buttonDatagridviewflowLayoutPanel。我在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查询会根据给定的邮政编码显示所有建筑物编号,然后对建筑物编号进行排序,然后创建新按钮并根据建筑物编号同时制作文本在dt2中显示datagridview

  • 问题:

screen shot

如屏幕截图所示,列&#34;建筑物编号&#34; datagridview中的dt2按照我的意愿排序,但是当我循环buttons并从dt2分配buttons文本时,在这种情况下,datagridview未在正确的方法。 按钮应按照datagridview

中的正确方式排序

请注意列&#34;建筑物编号&#34;在SQL表中是字符串的类型。此外,我正在使用margin来查看列是否已排序。

我看了hereherehere,但没有人帮助我。

如果有人知道如何从1,2,3,4,5,6,7开始以正确的方式排序这些按钮......

谢谢

1 个答案:

答案 0 :(得分:2)

您正在创建一个有序的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注入