Я хочу загрузить несколько групповых ящиков в приложении формы Windows, используя событие button_click.
Групповое поле должно появляться в форме каждый раз при нажатии кнопки.
Ожидаемый результат.
У меня возникли проблемы с определением динамического расположения группового ящика, так как второй групповой ящик должен находиться на некотором расстоянии от первого группового ящика. Я думал о ручном вычислении координат и использовании массива точек для местоположения, но я чувствую, что должен быть лучший способ сделать это.
Я определил переменную 'int count=0' для подсчета количества нажатий кнопки. Исходя из этого, я называю новый групповой ящик. Но я думаю, что есть некоторая проблема в логике, используемой в строке count++. Это не произойдет после 1. Поэтому я получаю только один групповой ящик «groupBox1». Ничего не происходит, когда я снова нажимаю кнопку.
Я ценю вашу помощь.
Спасибо
int count=0;
private GroupBox GetGroupBox(int a)
{
GroupBox groupBox = new GroupBox();
groupBox.Text = "groupBox"+(a.ToString());
groupBox.Width= 200;
groupBox.Height= 200;
groupBox.Location = new Point(50,400);
return groupBox;
}
private void button1_Click(object sender, EventArgs e)
{
count++;
this.Controls.Add(GetGroupBox(count));
}
Так как вы хотите создавать ящики слева направо, вы должны настроить Left
: скажем, 1-й ящик должен иметь Left = 50
, 2-й Left = 270
, 3d Left = 490
и т. д.
Код:
const int deltaX = 20;
...
//TODO: check do you really want Top = 400, not, say, 20?
groupBox.Location = new Point(50 + (a - 1) * (groupBox.Width + deltaX), 400);
...
Упрощенная реализация может быть
int count = 0;
// Let's rename the method: we actually create GroupBox, not get existing
private GroupBox CreateGroupBox(int index) => new GroupBox() {
Text = $"groupBox{index}",
Size = new Size(200, 200),
Location = new Point(50 + (index - 1) * (20 + 200), 400),
Parent = this, // Instead of Controls.Add()
};
private void button1_Click(object sender, EventArgs e) {
CreateGroupBox(++count);
}
Большое спасибо @Dmitry за вашу помощь. Теперь это работает. Не могли бы вы просветить меня, почему счет не увеличивался, когда я нажимал кнопку несколько раз. Простите меня, если мои вопросы слишком просты, так как я новичок в кодировании.
@Paras: В вашем коде в вопросе вы увеличиваете count
, но не используете его - обратите внимание, что GetGroupBox
не использует a
или count
В вашем вопросе указаны следующие цели:
GroupBox
на основе события (например, нажатия кнопки).GroupBox
местоположение.Вы говорите, что «чувствуете, что должен быть лучший способ сделать это», и он есть!
Попробуйте поэкспериментировать с FlowLayoutPanel
, который по своей природе справляется со всеми тремя задачами.
Вот код, который я использовал для добавления и удаления экземпляров CustomGroupBox
. Это элемент UserControl, который я добавил в свой проект, но он будет работать с любым типом элемента управления.)
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
numericUpDownGroupboxes.ValueChanged += onGroupBoxCountChanged;
foreach (var radio in Controls.OfType<RadioButton>())
{
radio.CheckedChanged += onFlowLayoutDirectionChanged;
}
}
Когда числовое значение вверх-вниз изменится, сравните ожидаемое количество групповых ящиков с текущим количеством. Кроме того, вы можете продолжить использовать нажатие кнопки и сразу перейти к flowLayoutPanel.Controls.Add(...)
.
private void onGroupBoxCountChanged(object sender, EventArgs e)
{
// Need an int for comparison.
int
countIs = flowLayoutPanel.Controls.OfType<CustomGroupBox>().Count(),
countShouldBe = (int)numericUpDownGroupboxes.Value;
switch(countIs.CompareTo(countShouldBe))
{
case -1:
flowLayoutPanel.Controls.Add(
new CustomGroupBox
{
Name = $"groupBox{countShouldBe}",
Text = $"GroupBox {countShouldBe}",
Size = new Size(300, 150),
Margin = new Padding(10),
BackColor = Color.White,
});
break;
case 1:
Control last = flowLayoutPanel.Controls.OfType<CustomGroupBox>().Last();
flowLayoutPanel.Controls.Remove(last);
break;
}
}
Также можно указать направление потока.
private void onFlowLayoutDirectionChanged(object sender, EventArgs e)
{
if (radioButtonHorizontal.Checked)
{
flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight;
}
else
{
flowLayoutPanel.FlowDirection = FlowDirection.TopDown;
}
}
}
Местоположение
groupBox.Location = new Point(50,400);
не должно быть постоянным,groupBox.Location = new Point(50 + count * (groupBox.Width + 10), 400);