是否可以传递或替换控件名称的一部分?

时间:2019-03-08 15:36:27

标签: c# .net winforms

首先,我要你自己做好准备。 我仅在大约6周前才开始编程。如果有任何值得关注的facepalm,我对此表示歉意。

我想知道是否可以仅传递控件名称的一部分?

这是想法:

我有两个团队,班级设置如下:

public class Team
{
    int    _established; //could be string
    string _name;
    double _best
}
//Snip

我有2套表格,两者的输入相同,但唯一的区别是名称:

//Team 1
    team1Year.Text = "";
    team1Name.Text = "";
    team1Numericupdown.Value = 0;
//Team 2
    team2Year.Text = "";
    team2Name.Text = "";
    team2Numericupdown.Value = 0;

因此,它基本上是相同的。我想知道是否可以创建一种方法来执行以下操作:

//Snip
Team team1 = new Team()
Team team2 = new Team()
//Not specific to problem, values can be anything
team1.estYear = 2008;
team1.Name = "Teamname1";
team1.Best = 137.8;

team2.estYear = 2009;
team2.Name = "GenericName";
team2.Best = 134.3;




private void HowToMethod(string tm, Team values)
{
    //so it would become like this - replace team1 and team2 with an argument
    tmYear.Text = values;
    tmName.Text = values;
    tmNumericupdown.Value = values;
}

在实践中:

HowToMethod(team1, team1.estYear)
//Output: team1Year.Text = 2008;

HowToMethod(team1, team1.Name)
//Output: team1Name.Text = Teamname1;

HowToMethod(team2, team2.Best)
//Output: team2Numericupdown.Value = 134.3;

这不是强制性的,我只是想知道是否有可能这样做。我对此没有解决办法很好。存在不同的控件/表单,并非全部相同,但从名称上来说它们属于同一“组”。 我希望它不会太混乱。

EDIT1: 因此,我尝试减少混乱。再次,我对Facepalm表示歉意。英语也不是我的母语,这也无济于事。无论如何,它就在这里:

这有效,但是对我来说,它看起来像是重复的代码。 我想知道是否有更简单的解决方案 ...不是高级主题

private void button1_Click(object sender, EventArgs e)
{
//Just one example. It's about manipulating Forms/Controls via code
    //Lock Team1's controls
    team1Year.Enabled = false;
    team1Name.Enabled = false;
    team1NumericUpDown.Enabled = false;
    //Lock Team 2's Controls
    team2Year.Enabled = false;
    team2Name.Enabled = false;
    team2NumericUpDown.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
//Another button unlocks
    //Unlock Team1's controls
    team1Year.Enabled = true;
    team1Name.Enabled = true;
    team1NumericUpDown.Enabled = true;
    //Unlock Team 2's Controls
    team2Year.Enabled = true;
    team2Name.Enabled = true;
    team2NumericUpDown.Enabled = true;
}

好,因此以上操作有效-手动选择我们要禁用的控件 可以是类似这样的东西: 如果未使用正确的对象类型,则表示歉意

private void MyMethod(int X, bool isItEnabled)
{
//This feels so, so wrong
    Control ctrl = sender as Control;
    team{X}Year.Enabled ;
    team{X}Name.Enabled = {isItEnabled};            
    team{X}NumericUpDown.Enabled = {isItEnabled};  
}

//In action:
private void button1_Click(object sender, EventArgs e)
{

MyMethod(1, false)
//Would mean/become:
    team{1}Year.Enabled = {false};
    team{1}Name.Enabled = {false};
    team{1}NumericUpDown.Enabled = {false};

//Or if the method was implemented differently:

private void MyMethod(string prefix, bool isItEnabled)
{
    {prefix}Year.Enabled ;
    {prefix}Name.Enabled = {isItEnabled};            
    {prefix}NumericUpDown.Enabled = {isItEnabled};            
}

//实际中:

MyMethod(team2, true)
//Would mean:
    {team2}Year.Enabled = {true};
    {team2}Name.Enabled = {true};
    {team2}NumericUpDown.Enabled = {true};

因此,传递的参数只能替换部分控件名称 如果他们有一个共享的序列名称

结论:

**是否可以引入变量来代替部分代码以实现模块化**: //将想法变成方法将是次要的 可能变成:

X =“ team1”;

Properties.Settings.Default.{X}Totals;
{X}Year.Text = "";
{X}Name.Text = "";
{X}Whatever.Text = "";
{X}NumericUpDown.Value = 135;

我知道它适用于Classes

private void TeamStuff(Team teamID, string value1, string value2)
{
teamID.Year = value;
teamID.Name = value;
//...etc
}
//then
TeamStuff (team1, "sample", "GenericName");
//becomes
team1.Year = "sample";
team1.Name = "GenericName";

1 个答案:

答案 0 :(得分:0)

我真的不知道您要做什么,我想可能会有更好的方法,但是要回答您的特定问题,这里是HowToMethod

的实现
private void HowToMethod(string tm, Team values)
{
    var yearControlName = tm + "Year";
    foreach(var ctrl in Controls)
    {
        if (ctrl is TextBox)
        {
            var tb = (ctrl as TextBox);
            if (tb.Name == yearControlName)
                tb.Text = values.EstYear.ToString();
        }
    }
}

它仅用于显示EstYear,但足以让您尝试并实施其余的内容,

P.S。当然可以使用Linq缩短此代码,但是为了简化起见,因为OP是新程序员,所以请保持这种方式。

编辑

现在事情变得更加清楚了,答案是否定的,如果您想基于变量值选择控件(在某些情况下适合),那您就不能做到这一点,但是您可以必须像我在上面的代码中显示的那样进行操作,即遍历所有控件并检查名称是否符合您的期望。
事实是您的代码经历了编译进度,例如对于编译器来说,可接受的控件名称是您在此处编写的实际文本,而不是可能产生相同名称的变量的组合,为什么?因为在运行代码之前(即在您编译代码之后且没有正确名称的情况下)变量不会获得其值,所以编译器将失败。