FlowLayoutPanel内用户控件通过上下移动进行顺序调整
2015-02-10 16:46
369 查看
我觉得FlowLayoutPanel容器真心是一个很好用的容器,尤其对其里面的控件有位置要求的时候,任意删除其中一个控件,后面的控件会自动上移,这很好的满足了本文所要阐述的需求要点:控制控件的顺序。样图如下:
用户控件源代码:
主界面关键代码:
用户控件源代码:
using System; using System.Windows.Forms; namespace Demo { public partial class UCBase : UserControl { public UCBase() { InitializeComponent(); this.label1.Text = Guid.NewGuid().ToString(); //该UC标识 } /// <summary> /// 设置上下可见性 /// </summary> /// <param name="up">是否上移</param> /// <param name="v">是否可见</param> public void SetVisible(bool up, bool v) { if (up) { picUp.Visible = v; } else { picDown.Visible = v; } } //声明事件委托 public delegate void OperatorEventHandler(object sender, Operator op); //定义事件 public event OperatorEventHandler OnOperatorClick; public void PicBox_Click(object sender, EventArgs e) { string picName = (sender as PictureBox).Name; switch (picName) { case "picUp": OnOperatorClick(this, Operator.Up); break; case "picDown": OnOperatorClick(this, Operator.Down); break; default: if (MessageBox.Show(string.Format("确定要移除该项吗?"), "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { OnOperatorClick(this, Operator.Remove); } break; } } } /// <summary> /// 操作枚举 /// </summary> public enum Operator { /// <summary> /// 上移 /// </summary> Up, /// <summary> /// 下移 /// </summary> Down, /// <summary> /// 移除 /// </summary> Remove } }
主界面关键代码:
private void btnAdd_Click(object sender, EventArgs e) { UCBase uc = new UCBase(); if (flowLayoutPanel1.Controls.Count == 0)//新添加项作为首项被添加 { uc.SetVisible(true, false);//不可上移 } else //非作为首相被添加 { UCBase ucUp = flowLayoutPanel1.Controls[flowLayoutPanel1.Controls.Count - 1] as UCBase; //获取添加项的上一项 ucUp.SetVisible(false, true); //上一项可下移 } uc.SetVisible(false, false); //新添加项不可下移(新添加项都加到底部,自然不可下移) uc.OnOperatorClick += new UCBase.OperatorEventHandler(uc_OnOperatorClick); uc.Width = 480; //设置宽度 flowLayoutPanel1.Controls.Add(uc); } private void uc_OnOperatorClick(object sender, Operator op) { UCBase uc = sender as UCBase; int oldIndex = flowLayoutPanel1.Controls.IndexOf(uc);//获取操作项的索引值 switch (op) { case Operator.Up: //上移操作,同时要关注上一项的状态变化 if (oldIndex == 1)//若是当前第二项 { uc.SetVisible(true, false);//上移后则变成第一项,自然不可再上移 } uc.SetVisible(false, true);//上移后肯定可以再下移 UCBase ucUp = flowLayoutPanel1.Controls[oldIndex - 1] as UCBase;//获取操作项的上一项 ucUp.SetVisible(true, true);//上一项被下移,则肯定可以再上移 if (oldIndex == flowLayoutPanel1.Controls.Count - 1)//若是当前最后一项 { ucUp.SetVisible(false, false); //上一项下移后则变成最后一项,自然不可再下移 } //上移操作项,这是根本,其他只是对状态进行变化 flowLayoutPanel1.Controls.SetChildIndex(uc, oldIndex - 1); break; case Operator.Down: //下移操作,同时要关注下一项的状态变化 if (oldIndex == flowLayoutPanel1.Controls.Count - 2)//若是当前倒数第二项 { uc.SetVisible(false, false);//下移后则变成最后一项,自然不可再下移 } uc.SetVisible(true, true);//下移后肯定可以再上移 UCBase ucDown = flowLayoutPanel1.Controls[oldIndex + 1] as UCBase;//获取操作项的下一项 ucDown.SetVisible(false, true);//下一项被上移,则肯定可以再下移 if (oldIndex == 0)//若是当前第一项 { ucDown.SetVisible(true, false);//下一项上移后则变成第一项,自然不可再上移 } //下移操作项 flowLayoutPanel1.Controls.SetChildIndex(uc, oldIndex + 1); break; default: //移除操作 if (flowLayoutPanel1.Controls.Count > 1) //项数至少两项的情况同时要关注上下两项的状态变化 { if (oldIndex == flowLayoutPanel1.Controls.Count - 1)//若是最后一项 { ucUp = flowLayoutPanel1.Controls[oldIndex - 1] as UCBase; ucUp.SetVisible(false, false);//上一项变成最后一项,自然不可下移 } else if (oldIndex == 0) //若是第一项 { ucDown = flowLayoutPanel1.Controls[oldIndex + 1] as UCBase; ucDown.SetVisible(true, false);//下一项变成第一项,自然不可上移 } } //移除操作项 flowLayoutPanel1.Controls.Remove(uc); break; } }
相关文章推荐
- 25-UI基础通过控件的 transform 属性,对控件进行移动,缩放,旋转操作,(补充简单动画)
- Flex中通过doubleClick事件来检测用户是否在TextInput控件中进行了双击(double clicks)操作的例子
- Flex中通过doubleClick事件来检测用户是否在TextInput控件中进行了双击(double clicks)操作的例子
- 一个简单的通过上下左右键移动div的案例--可用于游戏的用户操作界面
- MFC开发IM-第八篇、调整各个控件的上下tab顺序
- 在运行时通过鼠标拖动移动控件位置及改变控件的大小
- 在运行时通过鼠标拖动移动控件位置(c#)
- 一很简单的实现文章顺序上下互换移动的sql语句
- 在Web页面上通过OWC作图的用户控件
- 通过控件移动窗体
- 实现按ENTER,TAB可以按程序输入的控件顺序顺序移动
- 页面(Page)加载用户控件(UserControl)的事件触发顺序
- 通过回车控制光标向下一控件移动
- 通过代理使用用户控件
- 页面装载用户控件时的事件顺序
- 用户自定义控件加载顺序和Page_PreRender
- 根据网上的资料自己写的一个对表格进行客户端排序的.NET用户控件
- asp.net页面装载用户控件时的事件顺序
- 通过回车控制光标向下一控件移动
- [转]ASP.NET 缓存(十三)--通过使用声明性的属性缓存用户控件的多个版本