关于用户自定义控件事件在主窗体中的实现
今天需要做个菜单 因为要拿给别人用 所以就做了个自定义控件
用的时候只要拖拉上去 或者是动态加载上去就可以了
我这里是需要动态加载上去的 所以有点小郁闷的是需要根据点击不同的控件 传回不同的值
根据此值触发不同的事件
起初是准备给用户控件一个属性,让主窗体根据此值执行不同的事件 并且是点击该用户控件
因为我是在主窗体初始化的时候加载的控件 就算取到该值 也不能实现
上网找了下资料 先将解决方法写下,以备后用:
首先在用户控件中声明一个自定义事件
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);
}
{
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.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
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
种一棵树最好的时间是十年前,其次是现在.