我正在使用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方法,因此无效。
答案 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}}),并添加动态创建的控件到那个容器而不是添加到表单本身。