通过包含对象名称指定部分的字符串(或整数)引用对象的属性 - C#
Reference an object's property by a string (or integer) that contains specified part of the object's name - C#
例如,我有一个方法 returns 值“4”...我的按钮名称是“b4”。我想根据方法 returns 的数量来更改 b[=6=]"X" 的 Text 属性。在 C# 中最简单的方法。我是初学者所以请好好解释一下...我知道这可能是重复的post。但是我没看懂所有类似post中的答案。代码的布局是这样的:
我有一个包含五个数字的数组(例如 "int[] rnum = {1, 6, 7, 3, 8}")...我还有 5 个按钮应该根据数组中给出的整数禁用...我有 25 个按钮和他们的名字如下"b1, b2, b3, b4.... etc."。那么通过使用数组中给定的整数引用按钮对象的名称来更改按钮的 "Enabled" 属性的最简单方法是什么...例如 rnum[1] = 6 ==> b6.Enabled = false...我知道我可以做一个 switch 语句,但是如果有很多按钮,我该如何自动化呢?
正如@Alex K. 提到的那样
public Button GetButtonByIndex(int index)
{
return (Button)this.Controls.Find("b" + index, true).FirstOrDefault();
}
然后GetButtonByIndex(1)
将returnb1
等
您可以使用反射来完成。这是一个例子:
class Foo
{
public int Bar1 { get; set; }
public int Bar2 { get; set; }
public Foo()
{
Bar1 = 2;
Bar2 = 3;
}
public int GetBar(int barNum) //return type should be Button for you
{
PropertyInfo i = this.GetType().GetProperty("Bar"+barNum);
if (i == null)
throw new Exception("Bar" + barNum + " does not exist");
return (int)i.GetValue(this); //you should cast to Button instead of int
}
}
和主要:
class Program
{
static void Main(string[] args)
{
Foo f = new Foo();
for (int i = 1; i <= 3; i++)
try
{
Console.WriteLine(f.GetBar(i));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
输出将是:
2
3
Bar3 does not exist
请注意,虽然我打印了 foo.GetBar(i)
的结果,但在您的情况下,您可以这样做:foo.GetButton(i).Enabled = false;
虽然在 Controls
中寻找按钮(递归地或已知容器)会起作用,但更简单的解决方案(通常)是这个
var buttons = new[] {b1, b2, b3, b4, b5 }; // can be a field initialized in form constructor
buttons[number - 1].Text = "lalala"; // number is from 1 to 5
如果您不想将收到的 number
转换为 index
,那么您可以将 null
作为第一个元素添加到数组中。
例如,我有一个方法 returns 值“4”...我的按钮名称是“b4”。我想根据方法 returns 的数量来更改 b[=6=]"X" 的 Text 属性。在 C# 中最简单的方法。我是初学者所以请好好解释一下...我知道这可能是重复的post。但是我没看懂所有类似post中的答案。代码的布局是这样的:
我有一个包含五个数字的数组(例如 "int[] rnum = {1, 6, 7, 3, 8}")...我还有 5 个按钮应该根据数组中给出的整数禁用...我有 25 个按钮和他们的名字如下"b1, b2, b3, b4.... etc."。那么通过使用数组中给定的整数引用按钮对象的名称来更改按钮的 "Enabled" 属性的最简单方法是什么...例如 rnum[1] = 6 ==> b6.Enabled = false...我知道我可以做一个 switch 语句,但是如果有很多按钮,我该如何自动化呢?
正如@Alex K. 提到的那样
public Button GetButtonByIndex(int index)
{
return (Button)this.Controls.Find("b" + index, true).FirstOrDefault();
}
然后GetButtonByIndex(1)
将returnb1
等
您可以使用反射来完成。这是一个例子:
class Foo
{
public int Bar1 { get; set; }
public int Bar2 { get; set; }
public Foo()
{
Bar1 = 2;
Bar2 = 3;
}
public int GetBar(int barNum) //return type should be Button for you
{
PropertyInfo i = this.GetType().GetProperty("Bar"+barNum);
if (i == null)
throw new Exception("Bar" + barNum + " does not exist");
return (int)i.GetValue(this); //you should cast to Button instead of int
}
}
和主要:
class Program
{
static void Main(string[] args)
{
Foo f = new Foo();
for (int i = 1; i <= 3; i++)
try
{
Console.WriteLine(f.GetBar(i));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
输出将是:
2
3
Bar3 does not exist
请注意,虽然我打印了 foo.GetBar(i)
的结果,但在您的情况下,您可以这样做:foo.GetButton(i).Enabled = false;
虽然在 Controls
中寻找按钮(递归地或已知容器)会起作用,但更简单的解决方案(通常)是这个
var buttons = new[] {b1, b2, b3, b4, b5 }; // can be a field initialized in form constructor
buttons[number - 1].Text = "lalala"; // number is from 1 to 5
如果您不想将收到的 number
转换为 index
,那么您可以将 null
作为第一个元素添加到数组中。