1

画像とテキストを含む大きなボタンでメニューを作成しています。選択すると、ボタンの周囲に境界線が表示されます。

ボタンのテキストは常に同じであるとは限らず、ボタンのクリックの結果も同じではありません。

画像名とボタンごとのテキストを次のような構造体に設定しています:(4つありますが、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";
    }

データベースファイルを使わずにこれを簡単に行うことはできないと思います。

ボタンを作成するために、引数として使用する構造体を持つこの関数があり、スイッチケース構造で各ボタンが作成されます。しかし、私はこれらの関数にたくさんのコピーを貼り付けていることに気付いたので、これはもっと簡単にできるはずです。したがって、私は以下のようなことを試みましたが、それはうまくいきません。それが可能かどうか、どうすればいいのか知りたいです。

    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

メニューごとに1つずつ、の複数のリスト(または配列)を作成し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 に答える