开源 C# 快速开发(三)复杂控件
文章的目的为了记录使用C# 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
相关链接:
开源 C# 快速开发(一)基础知识
开源 C# 快速开发(二)基础控件
开源 C# 快速开发(三)复杂控件
推荐链接:
开源 C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客
开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客
开源 C# .net mvc 开发(三)WEB内外网访问-CSDN博客
开源 C# .net mvc 开发(四)工程结构、页面提交以及显示-CSDN博客
开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客
开源 C# .net mvc 开发(六)发送邮件、定时以及CMD编程-CSDN博客
开源 C# .net mvc 开发(七)动态图片、动态表格和json数据生成-CSDN博客
开源 C# .net mvc 开发(八)IIS Express轻量化Web服务器的配置和使用-CSDN博客
开源 C# .net mvc 开发(九)websocket--服务器与客户端的实时通信-CSDN博客
本章节主要内容是:创建了一个窗体应用程序,用于演示三种常见的复杂控件。列表控件:ListBox、ListView和DataGridView的功能和用法。
1.源码分析
2.所有源码
3.显示效果
一、源码分析
这个源码并没有采用界面设计器来进行ListBox、ListView和DataGridView这3中控件的拖取设计,而是采用了代码直接添加的办法。
1. 界面布局
使用TabControl组织三个不同的列表控件
每个控件位于独立的TabPage中
底部有一个多行文本框用于显示选择信息
1) TabControl创建和配置
TabControl tabControl = new TabControl();
tabControl.Dock = DockStyle.Top; // 停靠在顶部
tabControl.Height = 350; // 固定高度350像素
2)三个TabPage创建
TabPage tabListBox = new TabPage("ListBox");
TabPage tabListView = new TabPage("ListView");
TabPage tabDataGridView = new TabPage("DataGridView");
2. 控件配置特点
ListBox:
支持多选模式(MultiExtended)
包含9个项目,分为水果、蔬菜、饮料三组
ListBox listBox = new ListBox();
listBox.Dock = DockStyle.Fill; // 填充整个TabPage
listBox.SelectionMode = SelectionMode.MultiExtended; // 支持扩展多选
// 使用lambda表达式注册选择改变事件
listBox.SelectedIndexChanged += (s, e) => ShowSelectionInfo(listBox, textBoxResult, "ListBox");
ListView:
使用详细信息视图(View.Details)
启用整行选择和网格线
包含4列:序号、名称、类别、价格
ListView listView = new ListView();
listView.Dock = DockStyle.Fill;
listView.View = View.Details; // 详细信息视图
listView.FullRowSelect = true; // 整行选择
listView.GridLines = true; // 显示网格线
listView.MultiSelect = true; // 支持多选
listView.SelectedIndexChanged += (s, e) => ShowSelectionInfo(listView, textBoxResult, "ListView");
DataGridView:
绑定到DataTable数据源
设置为只读和整行选择模式
包含5列:ID、产品名称、分类、库存、状态
DataGridView dataGridView = new DataGridView();
dataGridView.Dock = DockStyle.Fill;
dataGridView.ReadOnly = true; // 只读模式
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; // 整行选择
dataGridView.MultiSelect = true; // 支持多选
dataGridView.SelectionChanged += (s, e) => ShowSelectionInfo(dataGridView, textBoxResult, "DataGridView");
3. 数据填充逻辑
每个控件都填充了3组数据,每组3个项目:
ListBox: 简单的文本项目
PopulateListBox()函数
private void PopulateListBox()
{string[] groups = { "水果", "蔬菜", "饮料" }; // 定义三组数据// 双层循环创建9个项目for (int i = 0; i < 3; i++) // 组循环{for (int j = 0; j < 3; j++) // 项目循环{string itemName = $"{groups[i]} - 项目{j + 1}"; // 格式化项目名称listBox.Items.Add(itemName); // 添加到ListBox}}
}
ListView: 结构化数据(价格信息)
PopulateListView()函数
private void PopulateListView()
{// 创建列头listView.Columns.Add("序号", 60); // 列名和宽度listView.Columns.Add("名称", 100);listView.Columns.Add("类别", 80);listView.Columns.Add("价格", 80);string[] categories = { "电子产品", "图书", "服装" };string[] prices = { "¥2999", "¥59", "¥199" };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){ListViewItem item = new ListViewItem((i * 3 + j + 1).ToString()); // 第一列item.SubItems.Add($"{categories[i]}型号{j + 1}"); // 第二列item.SubItems.Add(categories[i]); // 第三列 item.SubItems.Add(prices[i]); // 第四列listView.Items.Add(item);}}
}
DataGridView: 更复杂的数据结构(包含数字和状态)
PopulateDataGridView()函数
private void PopulateDataGridView()
{// 创建DataTable结构DataTable table = new DataTable();table.Columns.Add("ID", typeof(int));table.Columns.Add("产品名称", typeof(string));table.Columns.Add("分类", typeof(string));table.Columns.Add("库存", typeof(int));table.Columns.Add("状态", typeof(string));string[] statuses = { "有库存", "缺货", "预售" };string[] categories = { "手机", "电脑", "平板" };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){table.Rows.Add(i * 3 + j + 1, // ID$"{categories[i]} {j + 1}", // 产品名称categories[i], // 分类(j + 1) * 10, // 库存(10,20,30)statuses[j] // 状态);}}dataGridView.DataSource = table; // 绑定数据源// 设置列宽dataGridView.Columns[0].Width = 50;dataGridView.Columns[1].Width = 120;dataGridView.Columns[2].Width = 80;dataGridView.Columns[3].Width = 60;dataGridView.Columns[4].Width = 80;
}
4. 事件处理
使用统一的ShowSelectionInfo方法处理所有控件的选择变化事件,显示:
选中项目的详细信息
选中项目的总数
不同类型控件的特定属性
private void ShowSelectionInfo(object sender, TextBox textBox, string controlName){textBox.Clear();textBox.AppendText($"{controlName} 选择信息:\r\n");textBox.AppendText("".PadRight(40, '=') + "\r\n");if (sender is ListBox lb){if (lb.SelectedItems.Count == 0){textBox.AppendText("未选择任何项目\r\n");return;}foreach (var item in lb.SelectedItems){int index = lb.Items.IndexOf(item);textBox.AppendText($"序号: {index}, 名称: {item}\r\n");}textBox.AppendText($"总计选择: {lb.SelectedItems.Count} 个项目\r\n");}else if (sender is ListView lv){if (lv.SelectedItems.Count == 0){textBox.AppendText("未选择任何行\r\n");return;}foreach (ListViewItem item in lv.SelectedItems){textBox.AppendText($"序号: {item.Index}, ");textBox.AppendText($"名称: {item.SubItems[1].Text}, ");textBox.AppendText($"类别: {item.SubItems[2].Text}, ");textBox.AppendText($"价格: {item.SubItems[3].Text}\r\n");}textBox.AppendText($"总计选择: {lv.SelectedItems.Count} 行\r\n");}else if (sender is DataGridView dgv){if (dgv.SelectedRows.Count == 0){textBox.AppendText("未选择任何行\r\n");return;}foreach (DataGridViewRow row in dgv.SelectedRows){if (!row.IsNewRow){textBox.AppendText($"行号: {row.Index}, ");textBox.AppendText($"ID: {row.Cells["ID"].Value}, ");textBox.AppendText($"产品: {row.Cells["产品名称"].Value}, ");textBox.AppendText($"库存: {row.Cells["库存"].Value}, ");textBox.AppendText($"状态: {row.Cells["状态"].Value}\r\n");}}textBox.AppendText($"总计选择: {dgv.SelectedRows.Count} 行\r\n");}}
二、所有源码
Form1.cs源码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace _2_specialctrl
{public partial class Form1 : Form{public Form1(){InitializeComponent();InitializeControls();PopulateListBox();PopulateListView();PopulateDataGridView();}private void InitializeControls(){// 设置窗体this.Text = "List控件演示 - ListBox, ListView, DataGridView";this.Size = new Size(800, 600);this.StartPosition = FormStartPosition.CenterScreen;// 创建TabControl来组织三个控件TabControl tabControl = new TabControl();tabControl.Dock = DockStyle.Top;tabControl.Height = 350;// 创建三个TabPageTabPage tabListBox = new TabPage("ListBox");TabPage tabListView = new TabPage("ListView");TabPage tabDataGridView = new TabPage("DataGridView");// 创建显示结果的TextBoxTextBox textBoxResult = new TextBox();textBoxResult.Dock = DockStyle.Bottom;textBoxResult.Height = 100;textBoxResult.Multiline = true;textBoxResult.ScrollBars = ScrollBars.Vertical;textBoxResult.ReadOnly = true;// 将TabPage添加到TabControltabControl.TabPages.Add(tabListBox);tabControl.TabPages.Add(tabListView);tabControl.TabPages.Add(tabDataGridView);// 创建并配置ListBoxListBox listBox = new ListBox();listBox.Dock = DockStyle.Fill;listBox.SelectionMode = SelectionMode.MultiExtended;listBox.SelectedIndexChanged += (s, e) => ShowSelectionInfo(listBox, textBoxResult, "ListBox");// 创建并配置ListViewListView listView = new ListView();listView.Dock = DockStyle.Fill;listView.View = View.Details;listView.FullRowSelect = true;listView.GridLines = true;listView.MultiSelect = true;listView.SelectedIndexChanged += (s, e) => ShowSelectionInfo(listView, textBoxResult, "ListView");// 创建并配置DataGridViewDataGridView dataGridView = new DataGridView();dataGridView.Dock = DockStyle.Fill;dataGridView.ReadOnly = true;dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;dataGridView.MultiSelect = true;dataGridView.SelectionChanged += (s, e) => ShowSelectionInfo(dataGridView, textBoxResult, "DataGridView");// 将控件添加到各自的TabPagetabListBox.Controls.Add(listBox);tabListView.Controls.Add(listView);tabDataGridView.Controls.Add(dataGridView);// 添加到窗体this.Controls.Add(tabControl);this.Controls.Add(textBoxResult);// 存储控件引用以便后续使用this.listBox = listBox;this.listView = listView;this.dataGridView = dataGridView;}private void PopulateListBox(){// 为ListBox添加9个项目(3组,每组3个)string[] groups = { "水果", "蔬菜", "饮料" };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){string itemName = $"{groups[i]} - 项目{j + 1}";listBox.Items.Add(itemName);}}}private void PopulateListView(){// 为ListView创建列listView.Columns.Add("序号", 60);listView.Columns.Add("名称", 100);listView.Columns.Add("类别", 80);listView.Columns.Add("价格", 80);// 添加3行数据string[] categories = { "电子产品", "图书", "服装" };string[] prices = { "¥2999", "¥59", "¥199" };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){ListViewItem item = new ListViewItem((i * 3 + j + 1).ToString());item.SubItems.Add($"{categories[i]}型号{j + 1}");item.SubItems.Add(categories[i]);item.SubItems.Add(prices[i]);listView.Items.Add(item);}}}private void PopulateDataGridView(){// 创建DataTable作为数据源DataTable table = new DataTable();table.Columns.Add("ID", typeof(int));table.Columns.Add("产品名称", typeof(string));table.Columns.Add("分类", typeof(string));table.Columns.Add("库存", typeof(int));table.Columns.Add("状态", typeof(string));// 添加3行数据string[] statuses = { "有库存", "缺货", "预售" };string[] categories = { "手机", "电脑", "平板" };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){table.Rows.Add(i * 3 + j + 1,$"{categories[i]} {j + 1}",categories[i],(j + 1) * 10,statuses[j]);}}dataGridView.DataSource = table;// 设置列宽dataGridView.Columns[0].Width = 50;dataGridView.Columns[1].Width = 120;dataGridView.Columns[2].Width = 80;dataGridView.Columns[3].Width = 60;dataGridView.Columns[4].Width = 80;}private void ShowSelectionInfo(object sender, TextBox textBox, string controlName){textBox.Clear();textBox.AppendText($"{controlName} 选择信息:\r\n");textBox.AppendText("".PadRight(40, '=') + "\r\n");if (sender is ListBox lb){if (lb.SelectedItems.Count == 0){textBox.AppendText("未选择任何项目\r\n");return;}foreach (var item in lb.SelectedItems){int index = lb.Items.IndexOf(item);textBox.AppendText($"序号: {index}, 名称: {item}\r\n");}textBox.AppendText($"总计选择: {lb.SelectedItems.Count} 个项目\r\n");}else if (sender is ListView lv){if (lv.SelectedItems.Count == 0){textBox.AppendText("未选择任何行\r\n");return;}foreach (ListViewItem item in lv.SelectedItems){textBox.AppendText($"序号: {item.Index}, ");textBox.AppendText($"名称: {item.SubItems[1].Text}, ");textBox.AppendText($"类别: {item.SubItems[2].Text}, ");textBox.AppendText($"价格: {item.SubItems[3].Text}\r\n");}textBox.AppendText($"总计选择: {lv.SelectedItems.Count} 行\r\n");}else if (sender is DataGridView dgv){if (dgv.SelectedRows.Count == 0){textBox.AppendText("未选择任何行\r\n");return;}foreach (DataGridViewRow row in dgv.SelectedRows){if (!row.IsNewRow){textBox.AppendText($"行号: {row.Index}, ");textBox.AppendText($"ID: {row.Cells["ID"].Value}, ");textBox.AppendText($"产品: {row.Cells["产品名称"].Value}, ");textBox.AppendText($"库存: {row.Cells["库存"].Value}, ");textBox.AppendText($"状态: {row.Cells["状态"].Value}\r\n");}}textBox.AppendText($"总计选择: {dgv.SelectedRows.Count} 行\r\n");}}// 控件引用private ListBox listBox;private ListView listView;private DataGridView dataGridView;}
}
三、显示效果
listbox效果
listview效果
dataGridView效果