C++-CLI 按钮数组到 Winforms 中的 C# 按钮数组

C++-CLI Button Arrays to C# Button Arrays in Winforms

我正在使用 C# Winforms 设计一个应用程序(这是第一次)。我过去用 C++ 设计了几个应用程序,但在将我的一些 C++-CLI 函数转换为 C# 时遇到困难。

我在边栏上有 5 个按钮,每次单击按钮都会切换按钮对应面板的可见性。为此,我将所有其他面板的可见性设置为 false。为了在 C++-CLI 中实现这一点,我做了以下工作:

private: System::Void panels_Click(System::Object^  sender, System::EventArgs^  e) {
    System::Windows::Forms::Button ^ currentbutton = (System::Windows::Forms::Button ^) sender;
    array < Panel ^ > ^ objects = { panel1, panel2, panel3, panel4, panel5, panel6};
    array < Button ^ > ^ buttons = { button1, button2, button3, button4, button5, button6 };

    for (int i = 0; i < 6; i++) {
        if (buttons[i]->Equals(currentbutton)) {
            objects[i]->Visible = true;
        }
        else objects[i]->Visible = false;
    }
}

我遇到的问题是“array Panel ^”部分,因为我在 C# 中找不到等效项。感谢任何帮助。

您可以将 Controls 集合转换为 List<Control>,然后访问控件名称进行比较。 Cast<T>() 方法是一个 linq 扩展方法,因此您必须将 using System.Linq; 添加到您的命名空间:

private void panels_Click(object sender, EventArgs e)
{
    List<string> panelNames = new List<string>
    {"panel1", "panel2", "panel3", "panel4", "panel5", "panel6"};

    List<string> buttonNames = new List<string>
    {"button1", "button2", "button3", "button4", "button5", "button6"};

    List<Control> panels = this.Controls.Cast<Control>()
        .Where(ctrl => panelNames.Contains(ctrl.Name)).ToList();

    List<Control> buttons = this.Controls.Cast<Control>()
        .Where(ctrl => buttonNames.Contains(ctrl.Name)).ToList();

    Button thisButton = sender as Button;

    for (int i = 0; i < buttons.Count; i++)
    {
        if (i < panels.Count) panels[i].Visible = buttons[i] == thisButton;
    }
}

在 C# 中使用 TypeName[].

声明数组
Panel[] objects = { panel1, panel2, panel3, panel4, panel5, panel6 };
Button[] buttons = { button1, button2, button3, button4, button5, button6 };