C# добавление элементов управления на панель в цикле
Я хочу добавить кнопку для каждой строки в файле на панель. Мой код до сих пор:
StreamReader menu = new StreamReader("menu.prefs");
int repetition = 0;
while(!menu.EndOfStream)
{
Button dynamicbutton = new Button();
dynamicbutton.Click += new System.EventHandler(menuItem_Click);
dynamicbutton.Text = menu.ReadLine();
dynamicbutton.Visible = true;
dynamicbutton.Location = new Point(4+repetition*307, 4);
dynamicbutton.Height = 44;
dynamicbutton.Width = 203;
dynamicbutton.BackColor = Color.FromArgb(40,40,40);
dynamicbutton.ForeColor = Color.White;
dynamicbutton.Font = new Font("Lucida Console", 16);
dynamicbutton.Show();
menuPanel.Controls.Add(dynamicbutton);
repetition++;
MessageBox.Show(dynamicbutton.Location.ToString());
}
menu.Close();
проблема в том, что создается только первый элемент управления.
6 ответов
код выглядит нормально, но могут быть следующие ситуации.
1.Возможно, в файле есть только одна запись, поэтому на панель добавляется только одна кнопка.
2.Ширина панели меньше, чем сумма всех динамических кнопок.
Я подозреваю, что нет 2 является основной причиной, которая вызывает проблему.
Итак, я рекомендую вам использовать FlowLayoutPanel. Добавление динамического содержимого в виде автоматическое расположение всех дочерних элементов управления.
каждый раз, когда он генерирует одно и то же имя для динамических элементов управления. Вот почему он показывает только последний. Он просто перезаписывает предыдущий элемент управления каждый раз.
int x = 4;
int y = 4;
foreach(PhysicianData pd in listPhysicians)
{
x = 4;
y = panPhysicians.Controls.Count * 30;
RadioButton rb = new RadioButton();
rb.CheckedChanged += new System.EventHandler(rbPhysician_CheckedChanged);
rb.Text = pd.name;
rb.Visible = true;
rb.Location = new Point(x, y);
rb.Height = 40;
rb.Width = 200;
rb.BackColor = SystemColors.Control;
rb.ForeColor = Color.Black;
rb.Font = new Font("Microsoft Sans Serif", 10);
rb.Show();
rb.Name = "rb" + panPhysicians.Controls.Count;
panPhysicians.Controls.Add(rb);
}
попробуйте этот код
StreamReader menu = new StreamReader("menu.prefs");
var str = menu.ReadToEnd();
var items = str.Split(new string[] {"\r\n" } , StringSplitOptions.RemoveEmptyEntries);
foreach (var item in items)
{
Button dynamicbutton = new Button();
dynamicbutton.Click += new System.EventHandler(menuItem_Click);
dynamicbutton.Text = item;
dynamicbutton.Visible = true;
dynamicbutton.Location = new Point(4+repetition*307, 4);
dynamicbutton.Height = 44;
dynamicbutton.Width = 203;
dynamicbutton.BackColor = Color.FromArgb(40,40,40);
dynamicbutton.ForeColor = Color.White;
dynamicbutton.Font = new Font("Lucida Console", 16);
dynamicbutton.Show();
menuPanel.Controls.Add(dynamicbutton);
repetition++;
}
проблема с панелью и аналогичными органами управления, кроме управления flowlayoutpanel, это когда вы создаете контроль и второй, второй создается на той же позиции, если вы не меняете его местоположение динамически или по другим уже добавлены новые элементы управления. Это есть, это в первый контроль.
flowLayoutPanel лучше, так как он будет добавлять элементы управления рядом друг с другом, когда вы добавляете их, компрометируя более тонкий контроль на их позиционирование.
У меня также есть аналогичные проблемы с панелями. Для того, что вы делаете, может быть полезно просто добавить строки в список, а не использовать метки и панель. Это должно быть проще.