110,561
社区成员
发帖
与我相关
我的任务
分享
private void Bt_MouseEnter(object sender, EventArgs e)//房态按钮鼠标进入事件
{
Button bt2 = (Button)sender;
bt2.FlatAppearance.BorderSize = 3;
bt2.FlatAppearance.BorderColor = System.Drawing.Color.GreenYellow;
}
private void Bt_MouseLeave(object sender, EventArgs e)//房态按钮鼠标离开事件
{
Button bt3 = (Button)sender;
bt3.FlatAppearance.BorderSize = 0;
}
private void Bt_MouseDown(object sender, EventArgs e)//房态按钮鼠标按下事件
{
Button bt4 = (Button)sender;
if (ClickRoomNo != null)
{
foreach (Control c in flowLayoutPanel1.Controls)//先处理上一个控件,恢复它的两个事件
{
if (c.Text == ClickRoomNo)
{
c.MouseLeave += new EventHandler(Bt_MouseEnter);
c.MouseLeave += new EventHandler(Bt_MouseLeave);
c.FlatAppearance.BorderSize = 3;//此处报错,没有这个属性,可是C就是代表Button啊!百思不得其解
break;
}
}
ClickRoomNo = bt4.Text;
bt4.FlatAppearance.BorderSize = 3;
bt4.FlatAppearance.BorderColor = System.Drawing.Color.Black;
bt4.MouseLeave -= new EventHandler(Bt_MouseLeave);
bt4.MouseLeave -= new EventHandler(Bt_MouseEnter);
}
else
{
ClickRoomNo = bt4.Text;
bt4.FlatAppearance.BorderSize = 3;
bt4.FlatAppearance.BorderColor = System.Drawing.Color.Black;
bt4.MouseLeave -= new EventHandler(Bt_MouseLeave);
bt4.MouseLeave -= new EventHandler(Bt_MouseEnter);
}
}
var bt3 = (房间)sender;
if(!bt3.是否选定)
..............
这类代码,成文自明,因为代码就是业务逻辑,因为代码借助“用户控件”这个设计模式而封装到了跟系统业务分析文档完全一致的程度了,你所针对的控件就是“房态控件”而不是什么低级的“Button控件”。
而满脑子只有 Button 控件的方式,虽然在理解业务需求时很高大上,但是一写代码就发现“按钮并没有‘是否选定’的属性”,所以就弄出一大堆零散的数据和逻辑来了。这样写代码就跟业务很容易脱节了,很容易写乱了。 public partial class 房间 : UserControl
{
public 房间()
{
InitializeComponent();
}
public string 房间号
{
get
{
.................
}
set
{
.................
}
}
public bool 是否选定
{
get
{
.................
}
set
{
.................
}
}
........
那么你的 MouseLeave可以在时间处理中按照业务规则来设计界面表现,也就是类似private void 房间_MouseLeave(object sender, EventArgs e)//房态按钮鼠标离开事件
{
var bt3 = (房间)sender;
if(!bt3.是否选定)
{
bt3.TheButton.FlatAppearance.BorderSize = 0; //用户控件暴露一个Button 类型的 TheButton 属性
}
}
而另一个 MouseDown 事件处理方法中,并不应该去胡乱改动事件绑定,应该是去设置“房间控件”的“是否选定”属性。
总结一下,就是,你编程设计时应该提高一层次的设计,不要心中只有一大堆底层的 Button 控件,而要将“房间”局部界面的完整业务信息、操作方法,封装到用户控件中,作为一个整体来使用。这样你在设计流程时,就很自然地更多地考虑方便地结合业务逻辑了,“当房间是选中状态时,MouseLeave 就不应该再另外设置细边框”。当你描述界面用户体验时很方便地使用业务术语,而不是满脑子纠结于底层控件,编程也就简单了。
而这就在于你能够在组合 UI 控件时就将界面封装的层次提高一层,使用用户控件来封装“房态”对象,而不是用什么 Button 控件。