1

我正在创建一个带有包含图像和文本的大按钮的菜单。选中后,按钮周围会出现边框。

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

我在这样的结构中设置了图像名称和每个按钮的文本:(其中有四个,但我将显示 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];

        }
    }

有什么建议吗?

4

2 回答 2

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 没有控件数组。您可以创建另一个列表/数组来迭代或索引以使其正常工作。

于 2012-10-23T11:41:21.523 回答
0

反射

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;
    }
}
于 2012-10-23T11:42:08.010 回答