使用字符串来标识标签对象

时间:2016-05-16 13:25:25

标签: c#

我在C#中玩Windows窗体。我有一个窗口上有很多标签:label01,label02,label03等。每个标签都有一个分配给它的按钮:btn01,btn02等。

我想设置bnt01.visible = false,如果它对应label01.text == ""

我尝试构建一个数组来读取标签,但希望不必输入每个标签名称。

所以我希望使用for循环遍历标签,找到空白标签,并隐藏其各自的按钮:

string[] mysystems = new string[34]();  
for (int i = 0; i < 34; i++) {
    // Would like something similar to: mysystems[i]=label{0}.Text, i); 
    if(mysystems[i] != "") {}
    else
    {
        btn[i].visible = false; 
    }
}

我看过使用反射,但不太了解它的概念。 非常感谢任何帮助。

8 个答案:

答案 0 :(得分:3)

您可以创建ButtonLabelPair类:

internal class ButtonLabelPair
{
    internal Button AssociatedButton { get; private set; }
    internal Label AssociatedLabel { get; private set; }

    internal ButtonLabelPair(Button associatedButton, Label associatedLabel)
    {
        AssociatedButton = associatedButton;
        AssociatedLabel = associatedLabel;
    }
}

然后你可以在加载的某个时刻创建一对你的对列表:

var buttonLabelPairs = new List<ButtonLabelPair>();

buttonLabelPairs.AddRange(new ButtonLabelPair[] 
    {new ButtonLabelPair(btn01, label01), 
     new ButtonLabelPair(btn02, label02)});

然后你可以这样做你的循环:

foreach (var pair in buttonLabelPairs)
{
    pair.AssociatedButton.Visible =
        !string.IsNullOrEmpty(pair.AssociatedLabel.Text);
}

答案 1 :(得分:0)

您可以创建一个名为ButtonLabel

的类
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];

然后在你的表单中创建一个ButtonLabel列表并执行一个foreach循环并调用这样的HideIfEmpty方法:

class ButtonLabel
{
    Label Label;
    Button Button;

    public ButtonLabel(Button Button, Label Label)
    {
        this.Label = Label;
        this.Button = Button;
    }

    public void HideIfEmpty()
    {
        if(Label.Text=="")
            Button.Visible = false;
    }
}

答案 2 :(得分:0)

你可以使用for循环来做类似性质的事情

for (int i = 1; i < 35; i++) {
    string theControlNum = i < 1 ? "0" + i : i.ToString();
    if(this.Controls.Find($"label{theControlNum}").Text != "") {}
    else
    {
        this.Controls.Find($"btn{theControlNum}").visible = false; 
    }
}

正如您所看到的,循环从1开始,因此您不需要使用i + 1来获取控件名称,如果长度小于两位,则需要添加0。 / p>

答案 3 :(得分:0)

如果要在标签为空时隐藏按钮控件 试试这个: 在设计器文件中:

Label lbl0 = new Label();
    lbl0.TextChanged += new System.EventHandler(Lbl0_TextCanged);

在源文件中:

public void Lbl0_TextCanged(object sender,EventArgs e)
        {
            if (lbl0.Text.Trim() == "") button1.Visible = false;

        }

我写了'Trim()'来删除字符串

中的空白区域

答案 4 :(得分:0)

您不需要反思,您可以使用控件集合。即:

void Main()
{
    var f = new Form {Text = "Sample Form"};
    // add 10 buttons and 10 labels like btn00, ... btn09 lbl00, ... lbl09
    for (int i = 0; i < 10; i++)
    {
        var btn = new Button { Text = "Button" + i, 
            Name="btn" + i.ToString().PadLeft(2,'0'), 
            Top = i * 25, Left = 10, Width = 100 };
        var lbl = new Label { Text = i%2 == 0?"":"Visible", 
            Name="lbl" + i.ToString().PadLeft(2,'0'), 
            Top = i * 24, Left = 120};
        f.Controls.Add( btn );
        f.Controls.Add( lbl );
    }

    // make a button Visible = false if corrospending label is empty or null
    foreach (Label l in f.Controls.OfType<Label>().Where( l => Regex.IsMatch(l.Name, @"lbl\d{2}")))
    {
        if (string.IsNullOrEmpty(l.Text))
        {
           f.Controls.OfType<Button>().Single(b => b.Name == l.Name.Replace("lbl","btn")).Visible = false;
        }
    }
    f.Show();
}

答案 5 :(得分:0)

你可以这么做

for (var i = 0; i < length; ++i) {
    if (form.Controls[$"label{i:D2}"].Text == "") {
        form.Controls[$"btn{i:D2}"].Visible = false;
    }
}

其中length是您创建的标签和按钮元素的数量,form是父Form对象。

编辑:如果您没有C#6.0,请将插值字符串替换为string.Format

string.Format("label{0:D2}", i)

答案 6 :(得分:0)

您可以使用Dictionary<Button, string>,其中键是按钮,键的值是标签的文本。然后你可以迭代字典:

var dictionary = new Dictionary<Button, string>();
dictionary.Add(button1, label1.Text);
dictionary.Add(button2, label2.Text);
//  more pairs...
foreach(var key in dictionary.Keys)
{
    if(dictionary[key] == "")
    {
        key.Visible = false;
    }
}

答案 7 :(得分:0)

所以我决定为每个标签转储2个按钮,只使用标签中的选定文本。没有那么多代码,并在网上找到了一些代码:

private void btnShutdown_Click(object sender, EventArgs e)
        {
            //Shutdown the highligted systems 
            List<Control> list = new List<Control>();
            GetAllControl(this, list);
            DoShutdown(list);
        }

        private void btnRestart_Click(object sender, EventArgs e)
        {
            //Restart the highighted systems
            List<Control> list = new List<Control>();
            GetAllControl(this, list);
            DoRestart(list);
        }

        private void DoRestart(List<Control> list)
        {
            foreach (Control control in list)
            {
                if (control.BackColor == System.Drawing.Color.Aqua)
                {
                    restart m = new restart();
                    m.restartwin(control.Text);

                }
            }
            MessageBox.Show("Restart sent!", "Restart", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void DoShutdown(List<Control> list)
        {
            foreach (Control control in list)
            {
                if (control.BackColor == System.Drawing.Color.Aqua)
                {
                    powerApp m = new powerApp();
                    m.poweroffwin(control.Text);

                }
            }
            MessageBox.Show("Shutdown sent!", "Shutdown", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }  


        private void GetAllControl(Control c, List<Control> list)
        {
            foreach (Control control in c.Controls)
            {
                list.Add(control);

                if (control.Controls.Count > 0)
                {
                    GetAllControl(control, list);
                }

            }
        }

对所有人来说,感谢您的快速反应和帮助,我在接下来的路上学到了很多不同的想法。