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