我是C#的新手,我使用的是Windows窗体。
我Form1
有button
,Datagridview
和flowLayoutPanel
。我在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
。
如屏幕截图所示,列&#34;建筑物编号&#34; datagridview
中的dt2
按照我的意愿排序,但是当我循环buttons
并从dt2
分配buttons
文本时,在这种情况下,datagridview
未在正确的方法。
按钮应按照datagridview
请注意列&#34;建筑物编号&#34;在SQL表中是字符串的类型。此外,我正在使用margin
来查看列是否已排序。
如果有人知道如何从1,2,3,4,5,6,7开始以正确的方式排序这些按钮......
谢谢
答案 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注入