当前位置: 首页 > news >正文

开源 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;
// 创建三个TabPage
TabPage tabListBox = new TabPage("ListBox");
TabPage tabListView = new TabPage("ListView");
TabPage tabDataGridView = new TabPage("DataGridView");
// 创建显示结果的TextBox
TextBox textBoxResult = new TextBox();
textBoxResult.Dock = DockStyle.Bottom;
textBoxResult.Height = 100;
textBoxResult.Multiline = true;
textBoxResult.ScrollBars = ScrollBars.Vertical;
textBoxResult.ReadOnly = true;
// 将TabPage添加到TabControl
tabControl.TabPages.Add(tabListBox);
tabControl.TabPages.Add(tabListView);
tabControl.TabPages.Add(tabDataGridView);
// 创建并配置ListBox
ListBox listBox = new ListBox();
listBox.Dock = DockStyle.Fill;
listBox.SelectionMode = SelectionMode.MultiExtended;
listBox.SelectedIndexChanged += (s, e) => ShowSelectionInfo(listBox, textBoxResult, "ListBox");
// 创建并配置ListView
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
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");
// 将控件添加到各自的TabPage
tabListBox.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效果

http://www.gsyq.cn/news/18013.html

相关文章:

  • CF2145E Predicting Popularity
  • 深入解析:从Android到iOS:启动监控实现的跨平台技术对比
  • 百度开源 Qianfan-VL: 领域增强的通用视觉语言模型 - 详解
  • 2025 年聚丙烯酰胺厂商最新推荐排行榜:聚焦优质企业,助力企业精准选购环保水处理耗材PAM/沉淀剂/脱泥药剂/阴离子/阳离子聚丙烯酰胺厂商推荐
  • VMware 17.6 虚拟机 永久免费版安装包下载及安装教程!
  • Tmux中向上翻屏查找命令输出(KIMI)
  • CAD 多个dwg文件合成一张图(无需插件)
  • 鸿蒙应用开发从入门到实战(十八):组件编程思想之代码复用
  • arm环境vg损坏mysql数据库恢复---惜分飞
  • 2025 年国内连接器厂商最新推荐排行榜:聚焦 Type-C / 板对板等核心品类,精选优质企业助力下游选型针座/板对板/卡座/FPC/排针连接器厂家推荐
  • Elasticsearch 备份:方案篇
  • 【Android】解决安卓在隐藏强大的系统栏后usb鼠标被隐藏的疑问
  • 2025 最新推荐!溴化锂回收公司精选榜单:含制冷机 / 溶液 / 机组回收服务商权威测评及选择指南
  • 质量检验知识专题讲座之七:来料检验
  • 决斗(模拟赛题目T3)分析
  • gitlen中,已经提交了内容,如何回退到修改前?
  • HCIP-IoT/H52-111 真题详解(章节C),接入实用的技术和网络设计 /Part1
  • MySQL 8.0 my.cnf 配置详解
  • dremio sql server uniqueidentifier 数据类型问题
  • Why cant developing countries become developed?
  • 22 LCA模拟赛2T1 奶龙与贝利亚 题解
  • 微软拼音输入法自定义短语批量导入导出工具(支持Windows 10/11)
  • 01-Vue3阶段必会的前置知识-01变量和常量
  • 这是我的第一个个人博客
  • BLDC中的Q15
  • MaxProduct
  • Lab 4 Challenge - Sum of Proper Elements
  • Ignite3 竟然变成分布式数据库了!
  • WCH低功耗蓝牙系列芯片usb烧录故障排查
  • 使用docker构建.net api镜像及nginx反向代理 - binzi