如何用字符串替换控件的名称和方法?

时间:2016-02-17 13:36:53

标签: c# visual-studio

我正在使用C#中的SQL Server和Visual Studio编写触摸屏餐厅POS包。为了选择一个项目,我填充了一个包含四十个迭代的用户控件选择按钮的表单,该按钮包含一个Button控件和一个Label控件。这些用户控件包括一个网格,四列和十列深,列为A,B,C,D,行为1到10。根据相应Items数据表中的值,我需要使匹配的用户控件可见,设置其按钮的背景颜色,并将按钮的文本设置为Item的名称。要在用户控件的按钮上设置文本,它会带有以下代码:

   public string iButtonItem
    {
        get { return iButton.Text; }
        set { iButton.Text = value; }
    }

回到表单中,我加载了数据表,其中每个项目都有一个位置字段,例如A1或C8。现在我需要设置按钮。 对于给定的按钮,比如在位置A3处的一个按钮,这行代码完美地运行:

this.iButtonA3.iButtonItem = row["ItemName"].ToString().TrimEnd();

我的问题是,不是有四十套Switch / Case代码块,每个按钮一个,使用一个带有替换字符串的块会更优雅:“iButton”+ locationString +“。iButtonItem”这在FoxPro中很容易,我相信在Visual Basic中也是可能的。但是我怎样才能在C#中实现它?在此过程中,我尝试使用this.Controls.Find,但由于我需要调用的用户控件的iButtonItem方法,因此无效。

2 个答案:

答案 0 :(得分:1)

您可以使用Controls.Find访问iButtonItem,您只需要转换为包含它的控件类型:

var uc = this.Controls.Find("iButtonA3", true).FirstOrDefault() as YouUserControlType;
if (uc != null)
    uc.iButtonItem = "Hello";

或者

IDictionary<string, YouUserControlType> buttons;

public SomeForm()
{
    InitializeComponent();

    buttons = new Dictionary<string, YouUserControlType>()
    {
        { "iButtonA1", iButtonA1 },
        { "iButtonA2", iButtonA2 },
    };
}

允许buttons[nameString].iButtonItem = ...

答案 1 :(得分:1)

您似乎正在设计师中创建控件,但我不认为这是解决此问题的最佳方法。您可以动态创建所有控件,将它们添加到字典中,然后使用字典来解决这些控件。

FlowLayoutPanel

在这个例子中,我在for循环中创建每个用户控件,并绝对设置位置。这可能不是布局控件的最佳方式,但如果您愿意,可以使用布局容器(例如TableLayoutPanel或{{1}}),并添加动态创建的控件到那个容器而不是添加到表单本身。