关于用户自定义控件事件在主窗体中的实现

今天需要做个菜单   因为要拿给别人用  所以就做了个自定义控件 

用的时候只要拖拉上去 或者是动态加载上去就可以了

我这里是需要动态加载上去的 所以有点小郁闷的是需要根据点击不同的控件 传回不同的值

根据此值触发不同的事件

起初是准备给用户控件一个属性,让主窗体根据此值执行不同的事件  并且是点击该用户控件

因为我是在主窗体初始化的时候加载的控件  就算取到该值 也不能实现

上网找了下资料 先将解决方法写下,以备后用:

首先在用户控件中声明一个自定义事件

public event EventHandler menu_listView1_SelectedIndexChanged;

其次 在自定义控件的点击事件中触发改事件

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.menu_listView1_SelectedIndexChanged != null)
menu_listView1_SelectedIndexChanged(sender, e);
}

最后 要在主窗体中挂接该事件并实现该事件   在初始化的时候

this.menu.menu_listView1_SelectedIndexChanged += new EventHandler(menu_listView1_SelectedIndexChanged);

这样的话 只要点击自定义控件中的不同控件 就可以触发不同的事件了

具体的实现代码如下:

//用户自定义控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace MenuTest.UCcontrol
{
public partial class Menu : UserControl
{
public Menu()
{
InitializeComponent();

}
void CreateFirst()
{
mylistView.Items.Clear();
mylistView.LargeImageList
= imageListF;
mylistView.Items.Add(
"第一子菜单", 0);
mylistView.Items.Add(
"第二子菜单", 1);
}
void CreateSecond()
{
mylistView.Items.Clear();
mylistView.LargeImageList
= imageListS;
mylistView.Items.Add(
"第一子菜单", 0);
mylistView.Items.Add(
"第二子菜单", 1);
mylistView.Items.Add(
"第三子菜单", 2);
mylistView.Items.Add(
"第四子菜单", 3);
}
void CreateThree()
{
mylistView.Items.Clear();
mylistView.LargeImageList
= imageListT;
mylistView.Items.Add(
"第一子菜单", 0);
mylistView.Items.Add(
"第二子菜单", 1);
}
/// <summary>
/// 单击不同按钮 显示不同菜单
/// 原理:1 取到点击按钮 2 循环panel中的所有控件,如果是按钮
/// 再判断是否是点击的按钮,则设置其显示的位置
/// 3 别忘了所有控件显示在最前面 BringToFront()函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void ButtonClick(object sender, System.EventArgs e)
{
//获取点击的按钮
Button clickedButton = (Button)sender;
// 取到tab索引
int clickedButtonTabIndex = clickedButton.TabIndex;

//button显示的位置 最顶或者最底部
foreach (Control ctl in this.panel1.Controls) //取到panel1中的所有控件
{
if (ctl is Button) //如果是Button
{
Button btn
= (Button)ctl;
//如果取到的Button的TabIndex大于点击按钮的TabIndex
//即循环到得按钮不是所点击的按钮
if (btn.TabIndex > clickedButtonTabIndex)
{
//如果循环到的按钮没有显示在底部
if (btn.Dock != DockStyle.Bottom)
{
//则让其显示在底部
btn.Dock = DockStyle.Bottom;
// 显示在最前
btn.BringToFront();
}
}
else //循环到点击按钮
{
//没在顶部就显示在顶部
if (btn.Dock != DockStyle.Top)
{
btn.Dock
= DockStyle.Top;
// 显示在最前
btn.BringToFront();
}
}
}
}

switch (clickedButton.Text)
{
case "第一项":
CreateFirst();
break;

case "第二项":
CreateSecond();
break;

case "第三项":
CreateThree();
break;
}
mylistView.BringToFront();
}

//自定义自己的事件
public event EventHandler menu_listView1_SelectedIndexChanged;

//在此触发自己的自定义事件 以备在主窗体中挂接该事件
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.menu_listView1_SelectedIndexChanged != null)
menu_listView1_SelectedIndexChanged(sender, e);
}

}
}


本文来自CSDN博客,转载请标明出处:http:
//blog.csdn.net/qyj2009/archive/2011/04/21/6339191.aspx
//主窗体

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MenuTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//实例化用户控件
UCcontrol.Menu menu = new UCcontrol.Menu();
string Item;

private void Form1_Load(object sender, EventArgs e)
{


this.Controls.Add(menu);
//挂接用户控件事件
this.menu.menu_listView1_SelectedIndexChanged += new EventHandler(menu_listView1_SelectedIndexChanged);
}


//
#region //测试用户定义控件
void Do()
{
MessageBox.Show(
"第一子菜单");
}
//
void Do1()
{
MessageBox.Show(
"第二子菜单");
}

//根据不同的点击执行不同的事件
void Dosomething()
{
switch(Item)
{
case "第一子菜单":
Do();
break;
case "第二子菜单":
Do1();
break;
}
}


/// <summary>
/// 实现用户控件自定义事件 即自己定义的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void menu_listView1_SelectedIndexChanged(object sender, EventArgs e)
{

ListView listView
= (ListView)sender; //取到发送事件的控件
if (listView.SelectedIndices.Count > 0)
{
Item
= listView.SelectedItems[0].Text;
Dosomething();
}
}
#endregion
}
}


本文来自CSDN博客,转载请标明出处:http:
//blog.csdn.net/qyj2009/archive/2011/04/21/6339191.aspx

可能还需要设置一些属性值,相信信息可查看:http://blog.csdn.net/qyj2009/archive/2011/04/21/6339191.aspx

posted @ 2011-04-21 22:04  水目之痕  阅读(2174)  评论(0编辑  收藏  举报