今天看见一个代码很好用的,分享记录一下。
要求:
在c#中,用其中的控件实现下拉菜单显示。
即用按钮实现收缩菜单。
本文选用简单的button按钮和Listbox实现。
先看效果图:
图中不光实现了下拉,还额外设计了颜色变化。实现的基础是基于listbox中的drawitem()。
实现步骤:
1、随意创建一个C#程序即可。
2、先设置button按钮和listbox按钮。
3、设置listbox按钮属性中DrawMode为另外两个,根据你的需要设计。
4、编写下拉功能实现代码。
(1)主框架上
private void Form1_Load(object sender, EventArgs e)
{
LoadList();
}
(2)定义loadlist()
private void LoadList()
{
button1.BringToFront();
button1.Dock = DockStyle.Top;
listBox1.BringToFront();
listBox1.Dock = DockStyle.Top;
button2.BringToFront();
button2.Dock = DockStyle.Top;
listBox2.BringToFront();
listBox2.Dock = DockStyle.Top;
button3.BringToFront();
button3.Dock = DockStyle.Top;
listBox3.BringToFront();
listBox3.Dock = DockStyle.Top;
listBox1.Visible = false;
listBox2.Visible = false;
listBox3.Visible = false;
}```
(3)button按钮功能实现
双击图形上的按钮进入代码编写界面
```csharp
private void button1_Click(object sender, EventArgs e)
{
if (a == 0)
{
listBox1.Visible = true;
a = 1;
}
else
{
a = 0;
listBox1.Visible = false;
}
}
其他两个按钮通上编写。
这里值得注意的是要在前面声明三个初始量为0的三个变量,用来实现判断。
public partial class Form1 : Form
{
private Color SetColor = Color.AliceBlue;//
int a, b, c = 0;
public Form1()
{
InitializeComponent();
}
.......
4、实现按钮变色功能
直接上代码
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lb = sender as ListBox;
e.DrawBackground();
Brush myBrush = Brushes.Black;
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
myBrush = new SolidBrush(SetColor);
e.Graphics.FillRectangle(myBrush, e.Bounds);
}
//可针对每一列数据更改背景色
switch (e.Index)
{
case 0:
myBrush = Brushes.Red;
break;
case 1:
myBrush = Brushes.Orange;
break;
case 2:
myBrush = Brushes.Purple;
break;
case 3:
myBrush = Brushes.Aquamarine;
break;
case 4:
myBrush = Brushes.BlueViolet;
break;
}
StringFormat strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
strFormat.LineAlignment = StringAlignment.Center;
e.DrawFocusRectangle();
e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, strFormat);
}
其他两个listbox上也是同样编码。
5、运行检查一下代码是否出现错误,根据自身情况进行更改。
代码比较简单,一般不会有什么问题。
总结一下,代码总体很容易实现看懂。不过问题也是很明显,这样实现的下拉菜单会占用很大的空间,不适用于一些特殊要求,本人认为用于学习控件就可以了。
最后附上代码原文:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormsApp2
{
public partial class Form1 : Form
{
private Color SetColor = Color.AliceBlue;//
int a, b, c = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
LoadList();
}
//实现菜单下拉功能
private void LoadList()
{
button1.BringToFront();
button1.Dock = DockStyle.Top;
listBox1.BringToFront();
listBox1.Dock = DockStyle.Top;
button2.BringToFront();
button2.Dock = DockStyle.Top;
listBox2.BringToFront();
listBox2.Dock = DockStyle.Top;
button3.BringToFront();
button3.Dock = DockStyle.Top;
listBox3.BringToFront();
listBox3.Dock = DockStyle.Top;
listBox1.Visible = false;
listBox2.Visible = false;
listBox3.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
if (a == 0)
{
listBox1.Visible = true;
a = 1;
}
else
{
a = 0;
listBox1.Visible = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
if (b == 0)
{
listBox2.Visible = true;
b = 1;
}
else
{
b = 0;
listBox2.Visible = false;
}
}
private void button3_Click(object sender, EventArgs e)
{
if (c == 0)
{
listBox3.Visible = true;
c = 1;
}
else
{
c = 0;
listBox3.Visible = false;
}
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lb = sender as ListBox;
e.DrawBackground();
Brush myBrush = Brushes.Black;
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
myBrush = new SolidBrush(SetColor);
e.Graphics.FillRectangle(myBrush, e.Bounds);
}
//可针对每一列数据更改背景色
switch (e.Index)
{
case 0:
myBrush = Brushes.Red;
break;
case 1:
myBrush = Brushes.Orange;
break;
case 2:
myBrush = Brushes.Purple;
break;
case 3:
myBrush = Brushes.Aquamarine;
break;
case 4:
myBrush = Brushes.BlueViolet;
break;
}
StringFormat strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
strFormat.LineAlignment = StringAlignment.Center;
e.DrawFocusRectangle();
e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, strFormat);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void listBox2_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lb = sender as ListBox;
e.DrawBackground();
Brush myBrush = Brushes.Black;
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
myBrush = new SolidBrush(SetColor);
e.Graphics.FillRectangle(myBrush, e.Bounds);
}
//可针对每一列数据更改背景色
switch (e.Index)
{
case 0:
myBrush = Brushes.Red;
break;
case 1:
myBrush = Brushes.Orange;
break;
case 2:
myBrush = Brushes.Purple;
break;
case 3:
myBrush = Brushes.Aquamarine;
break;
case 4:
myBrush = Brushes.BlueViolet;
break;
}
StringFormat strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
strFormat.LineAlignment = StringAlignment.Center;
e.DrawFocusRectangle();
e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, strFormat);
}
private void listBox3_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox lb = sender as ListBox;
e.DrawBackground();
Brush myBrush = Brushes.Black;
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
myBrush = new SolidBrush(SetColor);
e.Graphics.FillRectangle(myBrush, e.Bounds);
}
//可针对每一列数据更改背景色
switch (e.Index)
{
case 0:
myBrush = Brushes.Red;
break;
case 1:
myBrush = Brushes.Orange;
break;
case 2:
myBrush = Brushes.Purple;
break;
case 3:
myBrush = Brushes.Aquamarine;
break;
case 4:
myBrush = Brushes.BlueViolet;
break;
}
StringFormat strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
strFormat.LineAlignment = StringAlignment.Center;
e.DrawFocusRectangle();
e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, strFormat);
}
}
}
最后,欢迎大家指正提意见。