如何让面板和标签协同工作?
How to make panels and labels work together?
我正在制作一个 10x10 的立方体,里面有面板和标签,以检查光标在面板上输入了多少次,更改面板上的颜色以及显示 1、2、3、4 等数字的标签。颜色就像这样 1-5 是蓝色,6-10 是绿色,11-15 是黄色,20 或更多是红色,我的问题是当光标只触摸标签时;只是标签变了,但我的面板上的颜色没有变,或者我的标签背景变了颜色,但面板有其他颜色。
关于以下内容的图片:
我之前问过一些类似的问题,但只检查了面板上的颜色,所以这是代码::
private void panel_MouseEnter(object sender, MouseEventArgs e)
{
Control ctrl = sender as Control;
//get previous value from control tag or start at 0
int count = ctrl.Tag == null ? 0 : (int)ctrl.Tag;
//set backcolor of control based on tag number
if (count >= 20) ctrl.BackColor = Color.Red;
else if (count >= 15) ctrl.BackColor = Color.Yellow;
else if (count >= 10) ctrl.BackColor = Color.Lime;
else if (count >= 5) ctrl.BackColor = Color.Cyan;
else ctrl.BackColor = Color.SlateBlue;
ctrl.Tag = ++count;
}
然后,我修改了代码以使用我的标签。
private void panel_MouseEnter(object sender, EventArgs e)
{
Control ctrl = sender as Control;
Control lctrl = sender as Control;
//get previous value from control tag or start at 0
int count = ctrl.Tag == null ? 0 : (int)ctrl.Tag;
//set backcolor of control based on tag number
if (count >= 20) ctrl.BackColor = Color.Red;
else if (count >= 15) ctrl.BackColor = Color.Yellow;
else if (count >= 10) ctrl.BackColor = Color.Lime;
else if (count >= 5) ctrl.BackColor = Color.Cyan;
else ctrl.BackColor = Color.SlateBlue;
lctrl.Text = count.ToString();// count for my label
count++;
ctrl.Tag = count;
}
注意:我在标签和面板上添加了相同的事件。
哈维尔·阿塞维斯,
问题是在触发 MouseEnter 事件时需要同时更新两个控件。要做到这一点,您需要做两件事。首先,正如其他人所提到的,Panel 和 Label 控件都需要调用一个公共的 MouseEnter 事件处理程序例程。其次,您需要更新触发事件的发件人以及发件人的父控件或子控件,具体取决于发件人是面板还是标签。
这里有一个关于如何完成这个的例子:
private void Process_MouseEnter(object sender, EventArgs e)
{
int count = 0;
Panel p = null;
if (sender is Panel)
{
p = sender as Panel;
// Compute the count using data stored in Label.Tag
foreach (Control c in p.Controls)
if (c is Label)
{
Label l = c as Label;
l.Text = (((int)l.Tag) + 1).ToString();
l.Tag = (int)l.Tag + 1;
count = (int)l.Tag;
break;
}
//set backcolor of control based on tag number
if (count >= 20) p.BackColor = Color.Red;
else if (count >= 15) p.BackColor = Color.Yellow;
else if (count >= 10) p.BackColor = Color.Lime;
else if (count >= 5) p.BackColor = Color.Cyan;
else p.BackColor = Color.SlateBlue;
} /* end Panel if */
if (sender is Label)
{
Label l = sender as Label;
l.Text = (((int)l.Tag) + 1).ToString();
l.Tag = (int)l.Tag + 1;
count = (int)l.Tag;
//set backcolor of control based on tag number
p = l.Parent as Panel;
if (count >= 20) p.BackColor = Color.Red;
else if (count >= 15) p.BackColor = Color.Yellow;
else if (count >= 10) p.BackColor = Color.Lime;
else if (count >= 5) p.BackColor = Color.Cyan;
else p.BackColor = Color.SlateBlue;
} /* end Label if */
}
请注意,可以通过结合其他人提到的想法来改进此代码。
对于初学者来说,如果面板是您的想法而不是某些要求的一部分,如 Phil1970 提到的那样,如果您不使用面板,您的代码会简单得多。此外,要解决数字显示问题,研究 LABEL 的 AutoElipsis 和 AutoSize 属性的使用可能会有所帮助。
我正在制作一个 10x10 的立方体,里面有面板和标签,以检查光标在面板上输入了多少次,更改面板上的颜色以及显示 1、2、3、4 等数字的标签。颜色就像这样 1-5 是蓝色,6-10 是绿色,11-15 是黄色,20 或更多是红色,我的问题是当光标只触摸标签时;只是标签变了,但我的面板上的颜色没有变,或者我的标签背景变了颜色,但面板有其他颜色。
关于以下内容的图片:
我之前问过一些类似的问题,但只检查了面板上的颜色,所以这是代码:
private void panel_MouseEnter(object sender, MouseEventArgs e)
{
Control ctrl = sender as Control;
//get previous value from control tag or start at 0
int count = ctrl.Tag == null ? 0 : (int)ctrl.Tag;
//set backcolor of control based on tag number
if (count >= 20) ctrl.BackColor = Color.Red;
else if (count >= 15) ctrl.BackColor = Color.Yellow;
else if (count >= 10) ctrl.BackColor = Color.Lime;
else if (count >= 5) ctrl.BackColor = Color.Cyan;
else ctrl.BackColor = Color.SlateBlue;
ctrl.Tag = ++count;
}
然后,我修改了代码以使用我的标签。
private void panel_MouseEnter(object sender, EventArgs e)
{
Control ctrl = sender as Control;
Control lctrl = sender as Control;
//get previous value from control tag or start at 0
int count = ctrl.Tag == null ? 0 : (int)ctrl.Tag;
//set backcolor of control based on tag number
if (count >= 20) ctrl.BackColor = Color.Red;
else if (count >= 15) ctrl.BackColor = Color.Yellow;
else if (count >= 10) ctrl.BackColor = Color.Lime;
else if (count >= 5) ctrl.BackColor = Color.Cyan;
else ctrl.BackColor = Color.SlateBlue;
lctrl.Text = count.ToString();// count for my label
count++;
ctrl.Tag = count;
}
注意:我在标签和面板上添加了相同的事件。
哈维尔·阿塞维斯,
问题是在触发 MouseEnter 事件时需要同时更新两个控件。要做到这一点,您需要做两件事。首先,正如其他人所提到的,Panel 和 Label 控件都需要调用一个公共的 MouseEnter 事件处理程序例程。其次,您需要更新触发事件的发件人以及发件人的父控件或子控件,具体取决于发件人是面板还是标签。
这里有一个关于如何完成这个的例子:
private void Process_MouseEnter(object sender, EventArgs e)
{
int count = 0;
Panel p = null;
if (sender is Panel)
{
p = sender as Panel;
// Compute the count using data stored in Label.Tag
foreach (Control c in p.Controls)
if (c is Label)
{
Label l = c as Label;
l.Text = (((int)l.Tag) + 1).ToString();
l.Tag = (int)l.Tag + 1;
count = (int)l.Tag;
break;
}
//set backcolor of control based on tag number
if (count >= 20) p.BackColor = Color.Red;
else if (count >= 15) p.BackColor = Color.Yellow;
else if (count >= 10) p.BackColor = Color.Lime;
else if (count >= 5) p.BackColor = Color.Cyan;
else p.BackColor = Color.SlateBlue;
} /* end Panel if */
if (sender is Label)
{
Label l = sender as Label;
l.Text = (((int)l.Tag) + 1).ToString();
l.Tag = (int)l.Tag + 1;
count = (int)l.Tag;
//set backcolor of control based on tag number
p = l.Parent as Panel;
if (count >= 20) p.BackColor = Color.Red;
else if (count >= 15) p.BackColor = Color.Yellow;
else if (count >= 10) p.BackColor = Color.Lime;
else if (count >= 5) p.BackColor = Color.Cyan;
else p.BackColor = Color.SlateBlue;
} /* end Label if */
}
请注意,可以通过结合其他人提到的想法来改进此代码。
对于初学者来说,如果面板是您的想法而不是某些要求的一部分,如 Phil1970 提到的那样,如果您不使用面板,您的代码会简单得多。此外,要解决数字显示问题,研究 LABEL 的 AutoElipsis 和 AutoSize 属性的使用可能会有所帮助。