用户控件之Child控件操作
自定义控件,公开向上/向下/增加/删除等几个操作的方法,用于让父窗口注册,父窗口通过这些方法可以实现对子自定义控件的向上/向下/增加/删除等操作。如下效果:
1.自定义控件:
/// <summary>
/// 操作枚举
/// </summary>
public enum Operator
{
/// <summary>
/// 上移
/// </summary>
Up,
/// <summary>
/// 下移
/// </summary>
Down,
/// <summary>
/// 移除
/// </summary>
Remove,
Add
}
public partial class UCChild : UserControl
{
public UCChild()
{
InitializeComponent();
}
public Action<object, Operator> OnOperatorClick = null;
private void btnRemove_Click(object sender, EventArgs e)
{
OnOperatorClick(this, Operator.Remove);
}
private void btnDown_Click(object sender, EventArgs e)
{
OnOperatorClick(this, Operator.Down);
}
private void btnAdd_Click(object sender, EventArgs e)
{
OnOperatorClick(this, Operator.Add);
}
private void btnUp_Click(object sender, EventArgs e)
{
OnOperatorClick(this, Operator.Up);
}
}
2.new自定义控件,并注册方法:
UCChild uc = new UCChild();
uc.OnOperatorClick += new Action<object, Operator>(ucSwitchPic_OnOperatorClick);
flowLayoutPanel1.Controls.Add(uc);
3.在调用界面分别对自定义控件的方法做出相应,以达到想要的效果:
private void ucSwitchPic_OnOperatorClick(object sender, Operator op)
{
UCChild uc = sender as UCChild;
int oldIndex = flowLayoutPanel1.Controls.IndexOf(uc);//获取操作项的索引值
switch (op)
{
case Operator.Up:
if (oldIndex == 0)//顶层了
{
MessageBox.Show("已经第一项了");
}
else
{
UCChild ucUp = this.flowLayoutPanel1.Controls[oldIndex - 1] as UCChild;//获取上一项
this.flowLayoutPanel1.Controls.SetChildIndex(ucUp, oldIndex);
this.flowLayoutPanel1.Controls.SetChildIndex(uc, oldIndex - 1);
}
break;
case Operator.Down:
if (oldIndex == flowLayoutPanel1.Controls.Count - 1)//底层了
{
MessageBox.Show("已经最后一项了");
}
else
{
UCChild ucDown = this.flowLayoutPanel1.Controls[oldIndex + 1] as UCChild;//获取下一项
this.flowLayoutPanel1.Controls.SetChildIndex(ucDown, oldIndex);
this.flowLayoutPanel1.Controls.SetChildIndex(uc, oldIndex + 1);
}
break;
case Operator.Remove:
UCChild uc1 = this.flowLayoutPanel1.Controls[oldIndex] as UCChild;
this.flowLayoutPanel1.Controls.Remove(uc1);
break;
case Operator.Add:
UCChild uc2 = new UCChild();
uc2.OnOperatorClick += new Action<object, Operator>(ucSwitchPic_OnOperatorClick);
this.flowLayoutPanel1.Controls.Add(uc2);
break;
}
}