官网
前提
入行已经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 } 47 48 private string strLastSearchText = string.Empty; 49 UCPagerControl m_page = new UCPagerControl(); 50 51 public UCComboxGridPanel() 52 { 53 InitializeComponent(); 54 this.ucDataGridView1.Page = m_page; 55 this.ucDataGridView1.IsAutoHeight = false; 56 this.txtSearch.txtInput.TextChanged += txtInput_TextChanged; 57 this.ucDataGridView1.ItemClick += ucDataGridView1_ItemClick; 58 } 59 60 void ucDataGridView1_ItemClick(object sender, DataGridViewEventArgs e) 61 { 62 if (ItemClick != null) 63 { 64 ItemClick((sender as IDataGridViewRow).DataSource, null); 65 } 66 } 67 68 void txtInput_TextChanged(object sender, EventArgs e) 69 { 70 timer1.Enabled = false; 71 timer1.Enabled = true; 72 } 73 74 private void UCComboxGridPanel_Load(object sender, EventArgs e) 75 { 76 m_page.DataSource = m_dataSource; 77 this.ucDataGridView1.DataSource = m_page.GetCurrentSource(); 78 } 79 80 private void timer1_Tick(object sender, EventArgs e) 81 { 82 if (strLastSearchText == txtSearch.InputText) 83 { 84 timer1.Enabled = false; 85 } 86 else 87 { 88 strLastSearchText = txtSearch.InputText; 89 Search(txtSearch.InputText); 90 } 91 } 92 93 private void Search(string strText) 94 { 95 m_page.StartIndex = 0; 96 if (!string.IsNullOrEmpty(strText)) 97 { 98 strText = strText.ToLower(); 99 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))); 100 m_page.DataSource = lst; 101 } 102 else 103 { 104 m_page.DataSource = m_dataSource; 105 } 106 m_page.Reload(); 107 } 108 } 109 }
1 namespace HZH_Controls.Controls.ComboBox 2 { 3 partial class UCComboxGridPanel 4 { 5 /// <summary> 6 /// 必需的设计器变量。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 清理所有正在使用的资源。 12 /// </summary> 13 /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region 组件设计器生成的代码 24 25 /// <summary> 26 /// 设计器支持所需的方法 - 不要 27 /// 使用代码编辑器修改此方法的内容。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.components = new System.ComponentModel.Container(); 32 this.panel1 = new System.Windows.Forms.Panel(); 33 this.panel2 = new System.Windows.Forms.Panel(); 34 this.timer1 = new System.Windows.Forms.Timer(this.components); 35 this.ucControlBase1 = new HZH_Controls.Controls.UCControlBase(); 36 this.ucDataGridView1 = new HZH_Controls.Controls.UCDataGridView(); 37 this.txtSearch = new HZH_Controls.Controls.UCTextBoxEx(); 38 this.ucSplitLine_V2 = new HZH_Controls.Controls.UCSplitLine_V(); 39 this.ucSplitLine_V1 = new HZH_Controls.Controls.UCSplitLine_V(); 40 this.ucSplitLine_H2 = new HZH_Controls.Controls.UCSplitLine_H(); 41 this.ucSplitLine_H1 = new HZH_Controls.Controls.UCSplitLine_H(); 42 this.panel1.SuspendLayout(); 43 this.ucControlBase1.SuspendLayout(); 44 this.SuspendLayout(); 45 // 46 // panel1 47 // 48 this.panel1.Controls.Add(this.ucControlBase1); 49 this.panel1.Controls.Add(this.panel2); 50 this.panel1.Controls.Add(this.txtSearch); 51 this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; 52 this.panel1.Location = new System.Drawing.Point(1, 1); 53 this.panel1.Name = "panel1"; 54 this.panel1.Padding = new System.Windows.Forms.Padding(5); 55 this.panel1.Size = new System.Drawing.Size(447, 333); 56 this.panel1.TabIndex = 4; 57 // 58 // panel2 59 // 60 this.panel2.Dock = System.Windows.Forms.DockStyle.Top; 61 this.panel2.Location = new System.Drawing.Point(5, 47); 62 this.panel2.Name = "panel2"; 63 this.panel2.Size = new System.Drawing.Size(437, 15); 64 this.panel2.TabIndex = 1; 65 // 66 // timer1 67 // 68 this.timer1.Interval = 1000; 69 this.timer1.Tick += new System.EventHandler(this.timer1_Tick); 70 // 71 // ucControlBase1 72 // 73 this.ucControlBase1.ConerRadius = 5; 74 this.ucControlBase1.Controls.Add(this.ucDataGridView1); 75 this.ucControlBase1.Dock = System.Windows.Forms.DockStyle.Fill; 76 this.ucControlBase1.FillColor = System.Drawing.Color.Transparent; 77 this.ucControlBase1.Font = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 78 this.ucControlBase1.IsRadius = false; 79 this.ucControlBase1.IsShowRect = true; 80 this.ucControlBase1.Location = new System.Drawing.Point(5, 62); 81 this.ucControlBase1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); 82 this.ucControlBase1.Name = "ucControlBase1"; 83 this.ucControlBase1.Padding = new System.Windows.Forms.Padding(5); 84 this.ucControlBase1.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); 85 this.ucControlBase1.RectWidth = 1; 86 this.ucControlBase1.Size = new System.Drawing.Size(437, 266); 87 this.ucControlBase1.TabIndex = 2; 88 this.ucControlBase1.TabStop = false; 89 // 90 // ucDataGridView1 91 // 92 this.ucDataGridView1.BackColor = System.Drawing.Color.White; 93 this.ucDataGridView1.Columns = null; 94 this.ucDataGridView1.DataSource = null; 95 this.ucDataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; 96 this.ucDataGridView1.HeadFont = new System.Drawing.Font("微软雅黑", 12F); 97 this.ucDataGridView1.HeadHeight = 40; 98 this.ucDataGridView1.HeadPadingLeft = 0; 99 this.ucDataGridView1.HeadTextColor = System.Drawing.Color.Black; 100 this.ucDataGridView1.IsAutoHeight = false; 101 this.ucDataGridView1.IsShowCheckBox = false; 102 this.ucDataGridView1.IsShowHead = true; 103 this.ucDataGridView1.Location = new System.Drawing.Point(5, 5); 104 this.ucDataGridView1.Name = "ucDataGridView1"; 105 this.ucDataGridView1.Page = null; 106 this.ucDataGridView1.RowHeight = 30; 107 this.ucDataGridView1.RowType = typeof(HZH_Controls.Controls.UCDataGridViewRow); 108 this.ucDataGridView1.Size = new System.Drawing.Size(427, 256); 109 this.ucDataGridView1.TabIndex = 0; 110 this.ucDataGridView1.TabStop = false; 111 // 112 // txtSearch 113 // 114 this.txtSearch.BackColor = System.Drawing.Color.Transparent; 115 this.txtSearch.ConerRadius = 5; 116 this.txtSearch.Cursor = System.Windows.Forms.Cursors.IBeam; 117 this.txtSearch.DecLength = 2; 118 this.txtSearch.Dock = System.Windows.Forms.DockStyle.Top; 119 this.txtSearch.FillColor = System.Drawing.Color.Empty; 120 this.txtSearch.Font = new System.Drawing.Font("微软雅黑", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 121 this.txtSearch.InputText = ""; 122 this.txtSearch.InputType = HZH_Controls.TextInputType.NotControl; 123 this.txtSearch.IsFocusColor = true; 124 this.txtSearch.IsRadius = true; 125 this.txtSearch.IsShowClearBtn = true; 126 this.txtSearch.IsShowKeyboard = false; 127 this.txtSearch.IsShowRect = true; 128 this.txtSearch.IsShowSearchBtn = false; 129 this.txtSearch.KeyBoardType = HZH_Controls.Controls.KeyBoardType.UCKeyBorderAll_EN; 130 this.txtSearch.Location = new System.Drawing.Point(5, 5); 131 this.txtSearch.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); 132 this.txtSearch.MaxValue = new decimal(new int[] { 133 1000000, 134 0, 135 0, 136 0}); 137 this.txtSearch.MinValue = new decimal(new int[] { 138 1000000, 139 0, 140 0, 141 -2147483648}); 142 this.txtSearch.Name = "txtSearch"; 143 this.txtSearch.Padding = new System.Windows.Forms.Padding(5); 144 this.txtSearch.PromptColor = System.Drawing.Color.Gray; 145 this.txtSearch.PromptFont = new System.Drawing.Font("微软雅黑", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 146 this.txtSearch.PromptText = "输入内容模糊搜索"; 147 this.txtSearch.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); 148 this.txtSearch.RectWidth = 1; 149 this.txtSearch.RegexPattern = ""; 150 this.txtSearch.Size = new System.Drawing.Size(437, 42); 151 this.txtSearch.TabIndex = 0; 152 // 153 // ucSplitLine_V2 154 // 155 this.ucSplitLine_V2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); 156 this.ucSplitLine_V2.Dock = System.Windows.Forms.DockStyle.Right; 157 this.ucSplitLine_V2.Location = new System.Drawing.Point(448, 1); 158 this.ucSplitLine_V2.Name = "ucSplitLine_V2"; 159 this.ucSplitLine_V2.Size = new System.Drawing.Size(1, 333); 160 this.ucSplitLine_V2.TabIndex = 3; 161 this.ucSplitLine_V2.TabStop = false; 162 // 163 // ucSplitLine_V1 164 // 165 this.ucSplitLine_V1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); 166 this.ucSplitLine_V1.Dock = System.Windows.Forms.DockStyle.Left; 167 this.ucSplitLine_V1.Location = new System.Drawing.Point(0, 1); 168 this.ucSplitLine_V1.Name = "ucSplitLine_V1"; 169 this.ucSplitLine_V1.Size = new System.Drawing.Size(1, 333); 170 this.ucSplitLine_V1.TabIndex = 2; 171 this.ucSplitLine_V1.TabStop = false; 172 // 173 // ucSplitLine_H2 174 // 175 this.ucSplitLine_H2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); 176 this.ucSplitLine_H2.Dock = System.Windows.Forms.DockStyle.Bottom; 177 this.ucSplitLine_H2.Location = new System.Drawing.Point(0, 334); 178 this.ucSplitLine_H2.Name = "ucSplitLine_H2"; 179 this.ucSplitLine_H2.Size = new System.Drawing.Size(449, 1); 180 this.ucSplitLine_H2.TabIndex = 1; 181 this.ucSplitLine_H2.TabStop = false; 182 // 183 // ucSplitLine_H1 184 // 185 this.ucSplitLine_H1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232))))); 186 this.ucSplitLine_H1.Dock = System.Windows.Forms.DockStyle.Top; 187 this.ucSplitLine_H1.Location = new System.Drawing.Point(0, 0); 188 this.ucSplitLine_H1.Name = "ucSplitLine_H1"; 189 this.ucSplitLine_H1.Size = new System.Drawing.Size(449, 1); 190 this.ucSplitLine_H1.TabIndex = 0; 191 this.ucSplitLine_H1.TabStop = false; 192 // 193 // UCComboxGridPanel 194 // 195 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; 196 this.BackColor = System.Drawing.Color.White; 197 this.Controls.Add(this.panel1); 198 this.Controls.Add(this.ucSplitLine_V2); 199 this.Controls.Add(this.ucSplitLine_V1); 200 this.Controls.Add(this.ucSplitLine_H2); 201 this.Controls.Add(this.ucSplitLine_H1); 202 this.Name = "UCComboxGridPanel"; 203 this.Size = new System.Drawing.Size(449, 335); 204 this.Load += new System.EventHandler(this.UCComboxGridPanel_Load); 205 this.panel1.ResumeLayout(false); 206 this.ucControlBase1.ResumeLayout(false); 207 this.ResumeLayout(false); 208 209 } 210 211 #endregion 212 213 private UCSplitLine_H ucSplitLine_H1; 214 private UCSplitLine_H ucSplitLine_H2; 215 private UCSplitLine_V ucSplitLine_V1; 216 private UCSplitLine_V ucSplitLine_V2; 217 private System.Windows.Forms.Panel panel1; 218 private UCControlBase ucControlBase1; 219 private UCDataGridView ucDataGridView1; 220 private System.Windows.Forms.Panel panel2; 221 private System.Windows.Forms.Timer timer1; 222 private UCTextBoxEx txtSearch; 223 } 224 }
以上,弹出面板完成,下面就是下拉控件了
添加一个用户控件UCComboxGrid,继承UCCombox
一些属性
1 private Type m_rowType = typeof(UCDataGridViewRow); 2 3 [Description("表格行类型"), Category("自定义")] 4 public Type GridRowType 5 { 6 get { return m_rowType; } 7 set 8 { 9 m_rowType = value; 10 } 11 } 12 int intWidth = 0; 13 14 private List<DataGridViewColumnEntity> m_columns = null; 15 16 [Description("表格列"), Category("自定义")] 17 public List<DataGridViewColumnEntity> GridColumns 18 { 19 get { return m_columns; } 20 set 21 { 22 m_columns = value; 23 if (value != null) 24 intWidth = value.Sum(p => p.WidthType == SizeType.Absolute ? p.Width : (p.Width < 80 ? 80 : p.Width)); 25 } 26 } 27 private List<object> m_dataSource = null; 28 29 [Description("表格数据源"), Category("自定义")] 30 public List<object> GridDataSource 31 { 32 get { return m_dataSource; } 33 set { m_dataSource = value; } 34 } 35 36 private string m_textField; 37 38 [Description("显示值字段名称"), Category("自定义")] 39 public string TextField 40 { 41 get { return m_textField; } 42 set 43 { 44 m_textField = value; 45 SetText(); 46 } 47 } 48 [Obsolete("不再可用的属性")] 49 [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 50 private new ComboBoxStyle BoxStyle 51 { 52 get; 53 set; 54 } 55 private object selectSource = null; 56 57 [Description("选中的数据源"), Category("自定义")] 58 public object SelectSource 59 { 60 get { return selectSource; } 61 set 62 { 63 selectSource = value; 64 SetText(); 65 if (SelectedChangedEvent != null) 66 { 67 SelectedChangedEvent(value, null); 68 } 69 } 70 } 71 72 [Description("选中数据源改变事件"), Category("自定义")] 73 public new event EventHandler SelectedChangedEvent;
重写点击事件来处理弹出
1 protected override void click_MouseDown(object sender, MouseEventArgs e) 2 { 3 if (m_columns == null || m_columns.Count <= 0) 4 return; 5 if (m_ucPanel == null) 6 { 7 var p = this.Parent.PointToScreen(this.Location); 8 int intScreenHeight = Screen.PrimaryScreen.Bounds.Height; 9 int intHeight = Math.Max(p.Y, intScreenHeight - p.Y - this.Height); 10 intHeight -= 100; 11 m_ucPanel = new UCComboxGridPanel(); 12 m_ucPanel.ItemClick += m_ucPanel_ItemClick; 13 m_ucPanel.Height = intHeight; 14 m_ucPanel.Width = intWidth; 15 m_ucPanel.Columns = m_columns; 16 m_ucPanel.RowType = m_rowType; 17 if (m_dataSource != null && m_dataSource.Count > 0) 18 { 19 int _intHeight = Math.Min(110 + m_dataSource.Count * 36, m_ucPanel.Height); 20 m_ucPanel.Height = _intHeight; 21 } 22 } 23 m_ucPanel.DataSource = m_dataSource; 24 if (_frmAnchor == null || _frmAnchor.IsDisposed || _frmAnchor.Visible == false) 25 { 26 _frmAnchor = new Forms.FrmAnchor(this, m_ucPanel); 27 _frmAnchor.Show(this.FindForm()); 28 } 29 30 } 31 32 void m_ucPanel_ItemClick(object sender, DataGridViewEventArgs e) 33 { 34 _frmAnchor.Hide(); 35 SelectSource = sender; 36 } 37 38 private void SetText() 39 { 40 if (!string.IsNullOrEmpty(m_textField) && selectSource != null) 41 { 42 var pro = selectSource.GetType().GetProperty(m_textField); 43 if (pro != null) 44 { 45 TextValue = pro.GetValue(selectSource, null).ToStringExt(); 46 } 47 } 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 using HZH_Controls.Controls; 10 11 namespace HZH_Controls.Controls.ComboBox 12 { 13 public partial class UCComboxGrid : UCCombox 14 { 15 16 private Type m_rowType = typeof(UCDataGridViewRow); 17 18 [Description("表格行类型"), Category("自定义")] 19 public Type GridRowType 20 { 21 get { return m_rowType; } 22 set 23 { 24 m_rowType = value; 25 } 26 } 27 int intWidth = 0; 28 29 private List<DataGridViewColumnEntity> m_columns = null; 30 31 [Description("表格列"), Category("自定义")] 32 public List<DataGridViewColumnEntity> GridColumns 33 { 34 get { return m_columns; } 35 set 36 { 37 m_columns = value; 38 if (value != null) 39 intWidth = value.Sum(p => p.WidthType == SizeType.Absolute ? p.Width : (p.Width < 80 ? 80 : p.Width)); 40 } 41 } 42 private List<object> m_dataSource = null; 43 44 [Description("表格数据源"), Category("自定义")] 45 public List<object> GridDataSource 46 { 47 get { return m_dataSource; } 48 set { m_dataSource = value; } 49 } 50 51 private string m_textField; 52 53 [Description("显示值字段名称"), Category("自定义")] 54 public string TextField 55 { 56 get { return m_textField; } 57 set 58 { 59 m_textField = value; 60 SetText(); 61 } 62 } 63 [Obsolete("不再可用的属性")] 64 [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 65 private new ComboBoxStyle BoxStyle 66 { 67 get; 68 set; 69 } 70 private object selectSource = null; 71 72 [Description("选中的数据源"), Category("自定义")] 73 public object SelectSource 74 { 75 get { return selectSource; } 76 set 77 { 78 selectSource = value; 79 SetText(); 80 if (SelectedChangedEvent != null) 81 { 82 SelectedChangedEvent(value, null); 83 } 84 } 85 } 86 87 88 89 [Description("选中数据源改变事件"), Category("自定义")] 90 public new event EventHandler SelectedChangedEvent; 91 public UCComboxGrid() 92 { 93 InitializeComponent(); 94 } 95 UCComboxGridPanel m_ucPanel = null; 96 Forms.FrmAnchor _frmAnchor; 97 protected override void click_MouseDown(object sender, MouseEventArgs e) 98 { 99 if (m_columns == null || m_columns.Count <= 0) 100 return; 101 if (m_ucPanel == null) 102 { 103 var p = this.Parent.PointToScreen(this.Location); 104 int intScreenHeight = Screen.PrimaryScreen.Bounds.Height; 105 int intHeight = Math.Max(p.Y, intScreenHeight - p.Y - this.Height); 106 intHeight -= 100; 107 m_ucPanel = new UCComboxGridPanel(); 108 m_ucPanel.ItemClick += m_ucPanel_ItemClick; 109 m_ucPanel.Height = intHeight; 110 m_ucPanel.Width = intWidth; 111 m_ucPanel.Columns = m_columns; 112 m_ucPanel.RowType = m_rowType; 113 if (m_dataSource != null && m_dataSource.Count > 0) 114 { 115 int _intHeight = Math.Min(110 + m_dataSource.Count * 36, m_ucPanel.Height); 116 m_ucPanel.Height = _intHeight; 117 } 118 } 119 m_ucPanel.DataSource = m_dataSource; 120 if (_frmAnchor == null || _frmAnchor.IsDisposed || _frmAnchor.Visible == false) 121 { 122 _frmAnchor = new Forms.FrmAnchor(this, m_ucPanel); 123 _frmAnchor.Show(this.FindForm()); 124 } 125 126 } 127 128 void m_ucPanel_ItemClick(object sender, DataGridViewEventArgs e) 129 { 130 _frmAnchor.Hide(); 131 SelectSource = sender; 132 } 133 134 private void SetText() 135 { 136 if (!string.IsNullOrEmpty(m_textField) && selectSource != null) 137 { 138 var pro = selectSource.GetType().GetProperty(m_textField); 139 if (pro != null) 140 { 141 TextValue = pro.GetValue(selectSource, null).ToStringExt(); 142 } 143 } 144 } 145 } 146 }
1 namespace HZH_Controls.Controls.ComboBox 2 { 3 partial class UCComboxGrid 4 { 5 /// <summary> 6 /// 必需的设计器变量。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 清理所有正在使用的资源。 12 /// </summary> 13 /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region 组件设计器生成的代码 24 25 /// <summary> 26 /// 设计器支持所需的方法 - 不要 27 /// 使用代码编辑器修改此方法的内容。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.SuspendLayout(); 32 // 33 // txtInput 34 // 35 this.txtInput.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240))))); 36 // 37 // UCComboxGrid 38 // 39 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; 40 this.BackColor = System.Drawing.Color.Transparent; 41 this.BoxStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 42 this.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240))))); 43 this.Name = "UCComboxGrid"; 44 this.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240))))); 45 this.ResumeLayout(false); 46 this.PerformLayout(); 47 48 } 49 50 #endregion 51 52 } 53 }
以上就是全部东西了
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧