认知尚浅,如有错误,愿闻其详!
概述
工作需要,需要个床位分布图,我们做的是比较简单的,没有涉及到分楼层等一些复杂的业务,所以看起来这个控件会简单点。目前业务需求也没太多,就简单的实现了换床等操作。后面会继续完善。
基本构造
控件基本实现并不难,对于初学者的我来说,也没能去好好地关心性能问题,在加载几百个床位的时候略显吃力。毕竟是一次性全部加载,不过这个可以通过分段加载可以解决,后期业务需要就弄弄。
以下是控件的基本构造:
底层是UserControl
,存储床位的是FlowLayoutPane
l控件,用于流式排布控件,然后为了使得床位具有一定属性,再写一个拓展Panel
,作为床位。每个床位有Id、Code、患者信息等属性,Panel内部由Label
来展示文本(本来想用Graphics绘制的,这样就不用控件事件继承底层控件事件了,比如说点击事件)
,需要图形的也可以添加Picture
控件,根据需求而定。床位的列数决定FlowLayoutPanel
宽度,行数决定FlowLayoutPanel
高度,高度适配是为了触发UserControl
的Scroll(开启AutoScroll
),以满足滚动,外加ContextMenuStrip
右键菜单,添加更多操作。
控件内部实现
控件创建
private void CreateBedsMap()
{
//添加床位
List<BedPropOption> beds = new List<BedPropOption>();
for (int i = 0; i < 12; i++)
{
BedPropOption bed = new BedPropOption();
bed.BedId = i;
bed.BedCode = $"{i}号";
beds.Add(bed);
}
//添加右键菜单
List<ToolStripItem> menus = new List<ToolStripItem>();
ToolStripItem item_1 = new ToolStripMenuItem();
item_1.Name = "转床";
item_1.Text = $"转床";
item_1.Click += new EventHandler(contextMenuStrip_ItemClick);
menus.Add(item_1);
for (int j = 0; j < 5; j++)
{
ToolStripItem item = new ToolStripMenuItem();
item.Name = j.ToString();
item.Text = $"功能{j}";
item.Click += new EventHandler(contextMenuStrip_ItemClick);
menus.Add(item);
}
cBedMapControl1.MouseToolMenu = menus;
cBedMapControl1.Beds = beds;
}
/// <summary>
/// 右键菜单工能
/// </summary>
private void contextMenuStrip_ItemClick(object sender, EventArgs e)
{
ToolStripItem item = sender as ToolStripItem;
ContextMenuStrip contextMenu = item.GetCurrentParent() as ContextMenuStrip;//获取菜单项父容器
BedPanel bedPanel = contextMenu.SourceControl as BedPanel;//获取触发菜单控件
switch (item.Name)
{
case "转床":
break;
}
}
效果展示
有需要的可以联系我,控件内部使用了一些私有模型,没办做成公有控件。