我在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;
}
}
我看过使用反射,但不太了解它的概念。 非常感谢任何帮助。
答案 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);
}
}
}
对所有人来说,感谢您的快速反应和帮助,我在接下来的路上学到了很多不同的想法。