繁体   English   中英

在运行时更改流布局面板中控件的顺序

[英]Changing order of controls in flow layout panel during runtime

我有一个 Windows 窗体,在它上面放了一个流布局面板。 我还有一个类可以读取本地数据库并返回相应的值。 根据用户通过按钮输入的信息,面板会被其他按钮填满。 这些按钮的数量取决于本地数据库中的值。 按钮显示正确且信息正确,但它们的显示顺序是按字母顺序排列的,即使来自数据库类的数据表以正确的方式排序(通过“ID”列的数值)从数据库)。

我还添加了一个数据网格视图来检查,并且项目以正确的方式显示。 我试图添加一个 for-each 循环,但这似乎只是随机化了按钮的顺序。

有谁知道我如何才能以正确的方式显示按钮,以便首先显示具有最低“ID”值的按钮。

下面是显示按钮的代码:

//set the datagridview with the correct values/names. Order works perfectly
dataGridView_AttackName.DataSource = db.attackIDName(attackCategory, taughtOn);
DataTable dt = db.attackIDName(attackCategory, taughtOn);
//sort datable again because doesnt work from db class
dt.DefaultView.Sort = "ID";
dt.DefaultView.ToTable();

int horizontal = 0;
int vertical = 0;
Button[] buttonArray = new Button[dt.Rows.Count];

for (int items = 0;  items < buttonArray.Length; items++)
{
  buttonArray[items] = new Button();
  buttonArray[items].Size = new Size(150, 50);
  buttonArray[items].Location = new Point(horizontal, vertical);
  buttonArray[items].Name = string.Format("Button_{0}", dt.Rows[items]["ID"].ToString());
  buttonArray[items].Text = dt.Rows[items]["Name"].ToString();
  buttonArray[items].Click += btn_msg;
  if ((items + 1) < buttonArray.Length)
  {
    vertical += 50;
  }
  flowLayoutPanel_AttackName.Controls.Add(buttonArray[items]);
}

//get the correct ID value from the button name and try to order it that way
foreach (Button b in flowLayoutPanel_AttackName.Controls)
{
  string name = b.Name;
  string subname = name.Substring(name.IndexOf("_") + 1);
  int i = Convert.ToInt32(subname);
  flowLayoutPanel_AttackName.Controls.SetChildIndex(b, i);
}

我在这个网站上四处搜索,但找不到任何有用的东西。

您已经按照 ID 正确地对 DefaultView 进行了排序,但是还没有使用结果!

例如,您需要将dt.Rows[items]["Name"]替换为dt.DefaultView[items].Row["Name"] 然后您不需要语句dt.DefaultView.ToTable()

完整代码如下:

        dt.DefaultView.Sort = "ID";
        int horizontal = 0;
        int vertical = 0;
        Button[] buttonArray = new Button[dt.Rows.Count];

        for (int items = 0; items < buttonArray.Length; items++)
        {
            buttonArray[items] = new Button();
            buttonArray[items].Size = new Size(150, 50);
            buttonArray[items].Location = new Point(horizontal, vertical);
            buttonArray[items].Name = string.Format("Button_{0}", dt.DefaultView[items].Row["ID"].ToString());
            buttonArray[items].Text = dt.DefaultView[items].Row["Name"].ToString();
            buttonArray[items].Click += btn_msg;

            if ((items + 1) < buttonArray.Length)
            {
                vertical += 50;
            }

            flowLayoutPanel_AttackName.Controls.Add(buttonArray[items]);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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