Изменение порядка элементов управления на панели макета потока во время выполнения - PullRequest
0 голосов
/ 16 января 2020

У меня есть форма Windows, в которую я помещаю панель макета потока. У меня также есть класс, который читает локальную базу данных и возвращает соответствующие значения. В зависимости от пользовательского ввода через кнопку (и) панель заполняется другими кнопками. Количество этих кнопок зависит от значений в локальной базе данных. Кнопки отображаются правильно и с правильной информацией, но порядок, в котором они отображаются, является алфавитным, хотя таблица данных из класса базы данных упорядочена в правильном порядке (через числовое значение столбца «ID») из базы данных).

Я также добавил представление сетки данных, чтобы проверить, и там элементы отображаются правильно. Я попытался добавить для каждого l oop, но это, кажется, просто случайным образом определяет порядок кнопок.

Кто-нибудь знает, как я могу получить правильное отображение кнопок, чтобы сначала отображается кнопка с наименьшим значением «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);
}

Я искал на этом сайте, но ничего не смог найти это сработало.

1 Ответ

0 голосов
/ 16 января 2020

Вы правильно отсортировали 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]);
        }
...