【问题标题】:Changing order of controls in flow layout panel during runtime在运行时更改流布局面板中的控件顺序
【发布时间】:2020-01-16 12:47:47
【问题描述】:

我有一个 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);
}

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

【问题讨论】:

  • dt.DefaultView.ToTable(); 返回一个新的DataTable,不设置当前的。 --- 当你循环一个集合并且你需要以某种方式修改集合(集合,而不是内部项)时,不要使用foreach 循环,使用for 循环,所以你不要修改您正在迭代的集合,可能会产生奇怪的结果或产生异常)。

标签: c# winforms flowlayoutpanel


【解决方案1】:

您已经按 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]);
        }

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2017-11-23
    • 2011-09-02
    相关资源
    最近更新 更多