ファイルのすべての行のボタンをパネルに追加したいと思います。これまでの私のコードは:
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();
問題は、最初のコントロールのみが作成されることです。
コードは正常に見えますが、以下の状況が考えられます。
1.ファイルにエントリが1つしかない場合があるため、パネルに追加されたボタンは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++;
}
PanelとFlowLayoutPanel以外の同様のコントロールの問題は、コントロールと2番目のコントロールを作成するときに、2番目のコントロールが動的に変更されていないか、すでに追加されている他のコントロールに従って設定しない場合、同じ位置に作成されます。あなたのコントロールはそこにあり、それは最初のコントロールの後ろにあります。
FlowLayoutPanelは、配置時にコントロールをより細かく妥協しながらコントロールを追加するときに、コントロールを隣に追加するため、優れています。