2012-10-23 36 views
1

我正在创建一个包含图像和文本的大按钮菜单。选中时,边框位于按钮周围。在c#中使用控件数组.net

按钮文本并不总是相同,并且按钮的结果也不会点击。

我有形象的名字,和每个按钮在这样的结构设置文本:(有他们四个人,但我会告诉2)

struct ConfigDevSubmenu 
    { 

     public const string SubMenuBtnText1 = ""; 
     public const string SubMenuBtnText2 = "text submenu 3 button 1"; 
     public const string SubMenuBtnText3 = "text submenu 3 button 2"; 
     public const string SubMenuBtnText4 = ""; 
     public const string SubMenuBtnImg1 = null; 
     public const string SubMenuBtnImg2 = "Settings.png"; 
     public const string SubMenuBtnImg3 = "LoadFirmware.png"; 
     public const string SubMenuBtnImg4 = null; 
     public const string SubMenuBtnBorder1 = "Borderstyle.None"; 
     public const string SubMenuBtnBorder2 = "Borderstyle.FixedSingle"; 
     public const string SubMenuBtnBorder3 = "Borderstyle.FixedSingle"; 
     public const string SubMenuBtnBorder4 = "Borderstyle.None"; 
    } 
    struct AdvancedSubmenu 
    { 
     public const string SubMenuBtnText1 = "text submenu 4 button 1"; 
     public const string SubMenuBtnText2 = "text submenu 4 button 2"; 
     public const string SubMenuBtnText3 = "text submenu 4 button 3"; 
     public const string SubMenuBtnText4 = "text submenu 4 button 4"; 
     public const string SubMenuBtnImg1 = "GenerateEncKey.png"; 
     public const string SubMenuBtnImg2 = "Monitoring.png"; 
     public const string SubMenuBtnImg3 = "AdvancedSettings.png"; 
     public const string SubMenuBtnImg4 = "GenerateConfigFile.png"; 
     public const string SubMenuBtnBorder1 = "Borderstyle.FixedSingle"; 
     public const string SubMenuBtnBorder2 = "Borderstyle.FixedSingle"; 
     public const string SubMenuBtnBorder3 = "Borderstyle.FixedSingle"; 
     public const string SubMenuBtnBorder4 = "Borderstyle.FixedSingle"; 
    } 

我不认为这是可以做到不使用数据库文件更容易。

创建按钮我有这个函数,它具有作为它应该使用哪个结构的参数,并且在switch case结构中创建每个按钮。 但是我发现自己在这些函数中复制粘贴很多,所以这一定更容易。因此我尝试了类似下面的内容,但这不起作用。我想知道是否有可能做出这项工作,以及我该如何做到这一点。

private void createButtons(string Struct) 
    { 
     for (int i = 1; i < 5; i++) 
     { 
      SubBtnText[i].Text = Struct.SubMenuBtnText[i]; 
      pictureBoxSubBtn[i].Image = Image.FromFile(Struct.SubMenuBtnImg[i]); 
      panelSubBtn[i].BorderStyle = Struct.SubMenuBtnBorder[i]; 

     } 
    } 

任何暗示?

回答

1

创建一个类来保存按钮文本,图像名称和边框样式 - 例如ButtonData

创建若干列表(或数组)ButtonData,每个菜单一个。

然后,您可以迭代列表并提取数据。

public class ButtonData 
{ 
    public ButtonData(string text, string image, BorderStyle border) 
    { 
     Text = text; 
     Image = image; 
     Border = border; 
    } 

    public string Text { get; private set; } 
    public string Image { get; private set; } 
    public BorderStyle Border { get; private set; } 
} 

var devMenuData = new List<ButtonData> { 
            new ButtonData("", null, "Borderstyle.None"), 
            new ButtonData("text submenu 3 button 1", 
               "Settings.png", 
               Borderstyle.FixedSingle), 
            ... 
             }; 

你的函数将是这样的:

private void CreateButtons(IEnumerable<ButtonData> data) 
{ 
    foreach (var buttonData in data) 
    { 
     SubBtnText[i].Text = buttonData.Text; 
     pictureBoxSubBtn[i].Image = Image.FromFile(buttonData.Image); 
     panelSubBtn[i].BorderStyle = buttonData.Border; 
    } 
} 

上述修正功能将不能为这样的工作,因为.NET没有控件数组。您可以创建另一个列表/数组来迭代或索引以实现此功能。

+0

这看起来真棒。我现在就试试看! – 2pietjuh2

+0

对此做了一些调整,但我不确定这比我更好,但我从中学到了:) – 2pietjuh2

0

reflection

class ButtonParameters 
{ 
    public string SubMenuBtnText = string.Empty; 
    public string SubMenuBtnImg = string.Empty; 
    public string SubMenuBtnBorder = string.Empty; 
} 

public Dictionary<int, ButtonParameters> CreateParameters(Type type) 
{ 
    FieldInfo[] fieldInfos = type.GetFields(
     BindingFlags.Public | BindingFlags.Static); 
    Dictionary<int, ButtonParameters> parameters = new Dictionary<int, ButtonParameters>(); 
    foreach (FieldInfo fieldInfo in fieldInfos) 
    { 
     if (fieldInfo.Name.Contains("SubMenuBtnText")) 
     { 
      int index = Convert.ToInt32(fieldInfo.Name.Substring(14)); 
      if (!parameters.ContainsKey(index)) 
      { 
       parameters.Add(index, new ButtonParameters()); 
      } 
      parameters[index].SubMenuBtnText = (string)fieldInfo.GetValue(null); 
     } 
     else if (fieldInfo.Name.Contains("SubMenuBtnImg")) 
     { 
      int index = Convert.ToInt32(fieldInfo.Name.Substring(13)); 
      if (!parameters.ContainsKey(index)) 
      { 
       parameters.Add(index, new ButtonParameters()); 
      } 
      parameters[index].SubMenuBtnImg= (string)fieldInfo.GetValue(null); 
     } 
     else if (fieldInfo.Name.Contains("SubMenuBtnBorder")) 
     { 
      int index = Convert.ToInt32(fieldInfo.Name.Substring(16)); 
      if (!parameters.ContainsKey(index)) 
      { 
       parameters.Add(index, new ButtonParameters()); 
      } 
      parameters[index].SubMenuBtnBorder= (string)fieldInfo.GetValue(null); 
     } 
    } 
    return parameters; 
} 

private void createButtons() 
{ 
    Dictionary<int, ButtonParameters> buttons = CreateParameters(typeof(AdvancedSubmenu)); 
    for (int i = 1; i < 5; i++) 
    { 
     SubBtnText[i].Text = buttons[i].SubMenuBtnText; 
     pictureBoxSubBtn[i].Image = Image.FromFile(buttons[i].SubMenuBtnImg); 
     panelSubBtn[i].BorderStyle = buttons[i].SubMenuBtnBorder; 
    } 
}