前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
麻烦博客下方点个【推荐】,谢谢
NuGet
Install-Package HZH_Controls
目录
https://www.cnblogs.com/bfyx/p/11364884.html
用处及效果
1 List<DataGridViewColumnEntity> lstCulumns = new List<DataGridViewColumnEntity>(); 2 lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "ID", HeadText = "编号", Width = 70, WidthType = SizeType.Absolute }); 3 lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Name", HeadText = "姓名", Width = 100, WidthType = SizeType.Absolute }); 4 lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Age", HeadText = "年龄", Width = 100, WidthType = SizeType.Absolute }); 5 lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Birthday", HeadText = "生日", Width = 120, WidthType = SizeType.Absolute, Format = (a) => { return ((DateTime)a).ToString("yyyy-MM-dd"); } }); 6 lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Sex", HeadText = "性别", Width = 100, WidthType = SizeType.Absolute, Format = (a) => { return ((int)a) == 0 ? "女" : "男"; } }); 7 this.ucComboxGrid1.GridColumns = lstCulumns; 8 List<object> lstSourceGrid = new List<object>(); 9 for (int i = 0; i < 100; i++) 10 { 11 TestModel model = new TestModel() 12 { 13 ID = i.ToString(), 14 Age = 3 * i, 15 Name = "姓名——" + i, 16 Birthday = DateTime.Now.AddYears(-10), 17 Sex = i % 2 18 }; 19 lstSourceGrid.Add(model); 20 } 21 this.ucComboxGrid1.GridDataSource = lstSourceGrid;
准备工作
此控件继承自UCCombox,并且需要表格控件UCDataGridView,如果不了解请移步查看
如果你想显示树形结构,请移步查看
(四十七)c#Winform自定义控件-树表格(treeGrid)
开始
我们首先需要一个弹出的面板,那么我们先添加一个用户控件UCComboxGridPanel,在这个用户控件上添加一个文本框进行搜索,添加一个表格展示数据
一些属性
1 [Description("项点击事件"), Category("自定义")] 2 public event DataGridViewEventHandler ItemClick; 3 private Type m_rowType = typeof(UCDataGridViewRow); 4 5 public Type RowType 6 { 7 get { return m_rowType; } 8 set 9 { 10 m_rowType = value; 11 this.ucDataGridView1.RowType = m_rowType; 12 } 13 } 14 15 private List<DataGridViewColumnEntity> m_columns = null; 16 17 public List<DataGridViewColumnEntity> Columns 18 { 19 get { return m_columns; } 20 set 21 { 22 m_columns = value; 23 this.ucDataGridView1.Columns = value; 24 } 25 } 26 private List<object> m_dataSource = null; 27 28 public List<object> DataSource 29 { 30 get { return m_dataSource; } 31 set { m_dataSource = value; } 32 } 33 34 private string strLastSearchText = string.Empty; 35 UCPagerControl m_page = new UCPagerControl();
一些事件,处理数据绑定
1 void ucDataGridView1_ItemClick(object sender, DataGridViewEventArgs e) 2 { 3 if (ItemClick != null) 4 { 5 ItemClick((sender as IDataGridViewRow).DataSource, null); 6 } 7 } 8 9 void txtInput_TextChanged(object sender, EventArgs e) 10 { 11 timer1.Enabled = false; 12 timer1.Enabled = true; 13 } 14 15 private void UCComboxGridPanel_Load(object sender, EventArgs e) 16 { 17 m_page.DataSource = m_dataSource; 18 this.ucDataGridView1.DataSource = m_page.GetCurrentSource(); 19 } 20 21 private void timer1_Tick(object sender, EventArgs e) 22 { 23 if (strLastSearchText == txtSearch.InputText) 24 { 25 timer1.Enabled = false; 26 } 27 else 28 { 29 strLastSearchText = txtSearch.InputText; 30 Search(txtSearch.InputText); 31 } 32 } 33 34 private void Search(string strText) 35 { 36 m_page.StartIndex = 0; 37 if (!string.IsNullOrEmpty(strText)) 38 { 39 strText = strText.ToLower(); 40 List<object> lst = m_dataSource.FindAll(p => m_columns.Any(c => (c.Format == null ? (p.GetType().GetProperty(c.DataField).GetValue(p, null).ToStringExt()) : c.Format(p.GetType().GetProperty(c.DataField).GetValue(p, null))).ToLower().Contains(strText))); 41 m_page.DataSource = lst; 42 } 43 else 44 { 45 m_page.DataSource = m_dataSource; 46 } 47 m_page.Reload(); 48 }
完整代码
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Drawing; 5 using System.Data; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace HZH_Controls.Controls.ComboBox 11 { 12 [ToolboxItem(false)] 13 public partial class UCComboxGridPanel : UserControl 14 { 15 [Description("项点击事件"), Category("自定义")] 16 public event DataGridViewEventHandler ItemClick; 17 private Type m_rowType = typeof(UCDataGridViewRow); 18 19 public Type RowType 20 { 21 get { return m_rowType; } 22 set 23 { 24 m_rowType = value; 25 this.ucDataGridView1.RowType = m_rowType; 26 } 27 } 28 29 private List<DataGridViewColumnEntity> m_columns = null; 30 31 public List<DataGridViewColumnEntity> Columns 32 { 33 get { return m_columns; } 34 set 35 { 36 m_columns = value; 37 this.ucDataGridView1.Columns = value; 38 } 39 } 40 private List<object> m_dataSource = null; 41 42 public List<object> DataSource 43 { 44 get { return m_dataSource; } 45 set { m_dataSource = value; } 46