認知尚淺,如有錯誤,愿聞其詳!
概述
??工作需要,需要個床位分布圖,我們做的是比較簡單的,沒有涉及到分樓層等一些復雜的業務,所以看起來這個控件會簡單點。目前業務需求也沒太多,就簡單的實現了換床等操作。后面會繼續完善。
基本構造
??控件基本實現并不難,對于初學者的我來說,也沒能去好好地關心性能問題,在加載幾百個床位的時候略顯吃力。畢竟是一次性全部加載,不過這個可以通過分段加載可以解決,后期業務需要就弄弄。
??以下是控件的基本構造:
??底層是UserControl
,存儲床位的是FlowLayoutPane
l控件,用于流式排布控件,然后為了使得床位具有一定屬性,再寫一個拓展Panel
,作為床位。每個床位有Id、Code、患者信息等屬性,Panel內部由Label
來展示文本(本來想用Graphics繪制的,這樣就不用控件事件繼承底層控件事件了,比如說點擊事件)
,需要圖形的也可以添加Picture
控件,根據需求而定。床位的列數決定FlowLayoutPanel
寬度,行數決定FlowLayoutPanel
高度,高度適配是為了觸發UserControl
的Scroll(開啟AutoScroll
),以滿足滾動,外加ContextMenuStrip
右鍵菜單,添加更多操作。
床位結構.png
控件內部實現
床位分布-基本實現.png
控件創建
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;
}
}
效果展示
有需要的可以聯系我,控件內部使用了一些私有模型,沒辦做成公有控件。
床位分布圖.gif