2016-03-08 53 views
0

我有一個帶有GroupBox的winform,我想在運行時動態創建標籤。我爲label.Namelabel.Text使用了Dictionary<string, string>。也許有更好的方式去做,我願意。我確實得到第一個label寫出正確,但不是其他的。建議?從字典中創建標籤

這裏是我的字典:

public static Dictionary<string, string> LabelTexts = new Dictionary<string, string>() 
{ 
    {"lblInstructions1", "Instructions 1." }, 
    {"lblInstructions2", "Instructions 2." }, 
    {"lblInstructions3", "Instructions 3." }, 
    {"lblInstructions4", "Instructions 4." }, 
    {"lblInstructions5", "Instructions 5." }, 
    {"lblInstructions6", "Instructions 6." }, 
    {"lblInstructions7", "Instructions 7." }, 
}; 

這裏是我使用的方法:

private void CreateLabelsForTesting(GroupBox grpBoxInstructions) 
{    
    foreach (KeyValuePair<string, string> labels in LabelTexts) 
    { 
     Label l = new Label(); 
     l.Name = labels.Key; 
     l.Text = labels.Value;     
     l.Size = new Size(130, 12);     
     l.Location = new Point(0, l.Bottom + 5); 

     grpBoxInstructions.Controls.Add(l); 
    } 
} 
+5

乍一看,很明顯你把所有的標籤在同一地點... – Pikoh

+0

看起來你把所有的標籤相同的位置,以便他們坐在彼此的頂部。放置一個變量來保存最後一個標籤的最後一個頂部位置,以便每次都可以遞增。 – Equalsk

+1

您正在將所有標籤放在同一位置:'(0,5)'。您可以使用「TableLayoutPanel」或「FlowLayoutPanel」來佈置標籤。你的要求是什麼? –

回答

1

你給您的所有標籤的相同位置:

l.Location = new Point(0, l.Bottom + 5); 

而是在這些方法之外放置一個變量來記住最後一個值並每次增加它:

private void CreateLabelsForTesting(GroupBox grpBoxInstructions) 
{  
    // This will remember the last position between loops 
    var lastPos = 0; 

    foreach (KeyValuePair<string, string> labels in LabelTexts) 
    { 
     Label l = new Label(); 
     l.Name = labels.Key; 
     l.Text = labels.Value;     
     l.Size = new Size(130, 12);     
     l.Location = new Point(0, lastPos); 

     lastPos += 15; // Adds 15 to the previous value 

     grpBoxInstructions.Controls.Add(l); 
    } 
} 

因此,在第一循環lastPos等於0,標籤將位於首位。如果你喜歡,你可以將它設置爲大於0的值,這只是一個例子。
第一次循環lastPos現在是15,所以第二個標籤將進一步下降15個像素。然後30,然後45等等...

+0

啊好吧,現在有道理。我試圖去掉最後一個標籤並在其底部添加5。 –

+0

你也可以這樣做,但這可能稍微容易一些。因爲你的標籤高12個像素,所以我只放了15個,如果你只增加5個值,他們仍然會重疊。根據自己的喜好調整值。 – Equalsk

+0

我將它改爲20,效果很好。謝謝! –

0
private void CreateLabelsForTesting(GroupBox grpBoxInstructions) 
{ 
    int x = 0; 
    int y = 0; 

    foreach (KeyValuePair<string, string> labels in LabelTexts) 
    { 
     Label l = new Label(); 
     l.Name = labels.Key; 
     l.Text = labels.Value;     
     l.Size = new Size(130, 12);  

     x += 0; 
     y += l.Height + 5;  

     l.Location = new Point(x, y); 

     grpBoxInstructions.Controls.Add(l); 
    } 
} 
+0

'x + = 0;'似乎有點毫無意義。 – juharr

+0

@juharr是的。但是如果OP想要修改X的位置,那麼這就是他們如何去做的。 – CathalMF