精华内容
下载资源
问答
  • c# 功能强大 酷牛逼的表格 自定义控件 dataGridView
  • WPF自定义表格控件

    2017-06-10 17:07:21
    WPF自定义控件,动态添加、删除行,支持编辑,对外提供DataTable数据
  • C# .net+DevExpress自定义控件(UserControl)之分页控件(含源代码),可直接调用,调用方法见https://blog.csdn.net/weixin_41607453/article/details/108294695
  • 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果...

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    目录

    https://blog.csdn.net/kwwwvagaa/article/details/100586547

    准备工作

    表格控件将拆分为2部分,1:行元素控件,2:列表控件

    为了具有更好的扩展性,更加的open,使用接口对行元素进行约束,当行样式或功能不满足你的需求的时候,可以自定义一个行元素,实现接口控件,然后将类型指定给列表控件即可

    表格控件用到了分页控件,如果你还没有对分页控件进行了解,请移步查看

    (十二)c#Winform自定义控件-分页控件

    开始

    定义一些辅助东西

    复制代码

    1  public class DataGridViewCellEntity
    2     {
    3         public string Title { get; set; }
    4         public int Width { get; set; }
    5         public System.Windows.Forms.SizeType WidthType { get; set; }
    6 
    7     }

    复制代码

    复制代码

    1     public class DataGridViewEventArgs : EventArgs
    2     {
    3         public Control CellControl { get; set; }
    4         public int CellIndex { get; set; }
    5         public int RowIndex { get; set; }
    6 
    7 
    8     }

    复制代码

    1     [Serializable]
    2     [ComVisible(true)]
    3     public delegate void DataGridViewEventHandler(object sender, DataGridViewEventArgs e);

    复制代码

    1   public class DataGridViewColumnEntity
    2     {
    3         public string HeadText { get; set; }
    4         public int Width { get; set; }
    5         public System.Windows.Forms.SizeType WidthType { get; set; }
    6         public string DataField { get; set; }
    7         public Func<object, string> Format { get; set; }
    8     }

    复制代码

    定义行接口

    复制代码

     1  public interface IDataGridViewRow
     2     {
     3         /// <summary>
     4         /// CheckBox选中事件
     5         /// </summary>
     6         event DataGridViewEventHandler CheckBoxChangeEvent;
     7         /// <summary>
     8         /// 点击单元格事件
     9         /// </summary>
    10         event DataGridViewEventHandler CellClick;
    11         /// <summary>
    12         /// 数据源改变事件
    13         /// </summary>
    14         event DataGridViewEventHandler SourceChanged;
    15         /// <summary>
    16         /// 列参数,用于创建列数和宽度
    17         /// </summary>
    18         List<DataGridViewColumnEntity> Columns { get; set; }
    19         bool IsShowCheckBox { get; set; }
    20         /// <summary>
    21         /// 是否选中
    22         /// </summary>
    23         bool IsChecked { get; set; }
    24 
    25         /// <summary>
    26         /// 数据源
    27         /// </summary>
    28         object DataSource { get; set; }
    29         /// <summary>
    30         /// 添加单元格元素,仅做添加控件操作,不做数据绑定,数据绑定使用BindingCells
    31         /// </summary>
    32         void ReloadCells();
    33         /// <summary>
    34         /// 绑定数据到Cell
    35         /// </summary>
    36         /// <param name="intIndex">cell下标</param>
    37         /// <returns>返回true则表示已处理过,否则将进行默认绑定(通常只针对有Text值的控件)</returns>
    38         void BindingCellData();
    39         /// <summary>
    40         /// 设置选中状态,通常为设置颜色即可
    41         /// </summary>
    42         /// <param name="blnSelected">是否选中</param>
    43         void SetSelect(bool blnSelected);
    44     }

    复制代码

    创建行控件

    添加一个用户控件,命名UCDataGridViewRow,实现接口IDataGridViewRow

    属性

    复制代码

     1   #region 属性
     2         public event DataGridViewEventHandler CheckBoxChangeEvent;
     3 
     4         public event DataGridViewEventHandler CellClick;
     5 
     6         public event DataGridViewEventHandler SourceChanged;
     7 
     8         public List<DataGridViewColumnEntity> Columns
     9         {
    10             get;
    11             set;
    12         }
    13 
    14         public object DataSource
    15         {
    16             get;
    17             set;
    18         }
    19 
    20         public bool IsShowCheckBox
    21         {
    22             get;
    23             set;
    24         }
    25         private bool m_isChecked;
    26         public bool IsChecked
    27         {
    28             get
    29             {
    30                 return m_isChecked;
    31             }
    32 
    33             set
    34             {
    35                 if (m_isChecked != value)
    36                 {
    37                     m_isChecked = value;
    38                     (this.panCells.Controls.Find("check", false)[0] as UCCheckBox).Checked = value;
    39                 }
    40             }
    41         }
    42 
    43 
    44         #endregion

    复制代码

    实现接口

    复制代码

      1    public void BindingCellData()
      2         {
      3             for (int i = 0; i < Columns.Count; i++)
      4             {
      5                 DataGridViewColumnEntity com = Columns[i];
      6                 var cs = this.panCells.Controls.Find("lbl_" + com.DataField, false);
      7                 if (cs != null && cs.Length > 0)
      8                 {
      9                     var pro = DataSource.GetType().GetProperty(com.DataField);
     10                     if (pro != null)
     11                     {
     12                         var value = pro.GetValue(DataSource, null);
     13                         if (com.Format != null)
     14                         {
     15                             cs[0].Text = com.Format(value);
     16                         }
     17                         else
     18                         {
     19                             cs[0].Text = value.ToStringExt();
     20                         }
     21                     }
     22                 }
     23             }
     24         }
     25 
     26  public void SetSelect(bool blnSelected)
     27         {
     28             if (blnSelected)
     29             {
     30                 this.BackColor = Color.FromArgb(255, 247, 245);
     31             }
     32             else
     33             {
     34                 this.BackColor = Color.Transparent;
     35             }
     36         }
     37 
     38         public void ReloadCells()
     39         {
     40             try
     41             {
     42                 ControlHelper.FreezeControl(this, true);
     43                 this.panCells.Controls.Clear();
     44                 this.panCells.ColumnStyles.Clear();
     45 
     46                 int intColumnsCount = Columns.Count();
     47                 if (Columns != null && intColumnsCount > 0)
     48                 {
     49                     if (IsShowCheckBox)
     50                     {
     51                         intColumnsCount++;
     52                     }
     53                     this.panCells.ColumnCount = intColumnsCount;
     54                     for (int i = 0; i < intColumnsCount; i++)
     55                     {
     56                         Control c = null;
     57                         if (i == 0 && IsShowCheckBox)
     58                         {
     59                             this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F));
     60 
     61                             UCCheckBox box = new UCCheckBox();
     62                             box.Name = "check";
     63                             box.TextValue = "";
     64                             box.Size = new Size(30, 30);
     65                             box.Dock = DockStyle.Fill;
     66                             box.CheckedChangeEvent += (a, b) =>
     67                             {
     68                                 IsChecked = box.Checked;
     69                                 if (CheckBoxChangeEvent != null)
     70                                 {
     71                                     CheckBoxChangeEvent(a, new DataGridViewEventArgs()
     72                                     {
     73                                         CellControl = box,
     74                                         CellIndex = 0
     75                                     });
     76                                 }
     77                             };
     78                             c = box;
     79                         }
     80                         else
     81                         {
     82                             var item = Columns[i - (IsShowCheckBox ? 1 : 0)];
     83                             this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width));
     84 
     85                             Label lbl = new Label();
     86                             lbl.Tag = i - (IsShowCheckBox ? 1 : 0);
     87                             lbl.Name = "lbl_" + item.DataField;
     88                             lbl.Font = new Font("微软雅黑", 12);
     89                             lbl.ForeColor = Color.Black;
     90                             lbl.AutoSize = false;
     91                             lbl.Dock = DockStyle.Fill;
     92                             lbl.TextAlign = ContentAlignment.MiddleCenter;
     93                             lbl.MouseDown += (a, b) =>
     94                             {
     95                                 Item_MouseDown(a, b);
     96                             };
     97                             c = lbl;
     98                         }
     99                         this.panCells.Controls.Add(c, i, 0);
    100                     }
    101 
    102                 }
    103             }
    104             finally
    105             {
    106                 ControlHelper.FreezeControl(this, false);
    107             }
    108         }

    复制代码

    节点选中事件

    复制代码

     1    void Item_MouseDown(object sender, MouseEventArgs e)
     2         {
     3             if (CellClick != null)
     4             {
     5                 CellClick(sender, new DataGridViewEventArgs()
     6                 {
     7                     CellControl = this,
     8                     CellIndex = (sender as Control).Tag.ToInt()
     9                 });
    10             }
    11         }

    复制代码

    完整的代码

     View Code

     View Code

     

    接下来就是列表控件了

    添加一个用户控件,命名UCDataGridView

    属性

    复制代码

      1  #region 属性
      2         private Font m_headFont = new Font("微软雅黑", 12F);
      3         /// <summary>
      4         /// 标题字体
      5         /// </summary>
      6         [Description("标题字体"), Category("自定义")]
      7         public Font HeadFont
      8         {
      9             get { return m_headFont; }
     10             set { m_headFont = value; }
     11         }
     12         private Color m_headTextColor = Color.Black;
     13         /// <summary>
     14         /// 标题字体颜色
     15         /// </summary>
     16         [Description("标题文字颜色"), Category("自定义")]
     17         public Color HeadTextColor
     18         {
     19             get { return m_headTextColor; }
     20             set { m_headTextColor = value; }
     21         }
     22 
     23         private bool m_isShowHead = true;
     24         /// <summary>
     25         /// 是否显示标题
     26         /// </summary>
     27         [Description("是否显示标题"), Category("自定义")]
     28         public bool IsShowHead
     29         {
     30             get { return m_isShowHead; }
     31             set
     32             {
     33                 m_isShowHead = value;
     34                 panHead.Visible = value;
     35                 if (m_page != null)
     36                 {
     37                     ResetShowCount();
     38                     m_page.PageSize = m_showCount;
     39                 }
     40             }
     41         }
     42         private int m_headHeight = 40;
     43         /// <summary>
     44         /// 标题高度
     45         /// </summary>
     46         [Description("标题高度"), Category("自定义")]
     47         public int HeadHeight
     48         {
     49             get { return m_headHeight; }
     50             set
     51             {
     52                 m_headHeight = value;
     53                 panHead.Height = value;
     54             }
     55         }
     56 
     57         private bool m_isShowCheckBox = false;
     58         /// <summary>
     59         /// 是否显示复选框
     60         /// </summary>
     61         [Description("是否显示选择框"), Category("自定义")]
     62         public bool IsShowCheckBox
     63         {
     64             get { return m_isShowCheckBox; }
     65             set
     66             {
     67                 if (value != m_isShowCheckBox)
     68                 {
     69                     m_isShowCheckBox = value;
     70                     LoadColumns();
     71                 }
     72             }
     73         }
     74 
     75         private int m_rowHeight = 40;
     76         /// <summary>
     77         /// 行高
     78         /// </summary>
     79         [Description("数据行高"), Category("自定义")]
     80         public int RowHeight
     81         {
     82             get { return m_rowHeight; }
     83             set { m_rowHeight = value; }
     84         }
     85 
     86         private int m_showCount = 0;
     87         /// <summary>
     88         /// 
     89         /// </summary>
     90         [Description("可显示个数"), Category("自定义")]
     91         public int ShowCount
     92         {
     93             get { return m_showCount; }
     94             private set
     95             {
     96                 m_showCount = value;
     97                 if (m_page != null)
     98                 {
     99                     m_page.PageSize = value;
    100                 }
    101             }
    102         }
    103 
    104         private List<DataGridViewColumnEntity> m_columns;
    105         /// <summary>
    106         /// 列
    107         /// </summary>
    108         [Description("列"), Category("自定义")]
    109         public List<DataGridViewColumnEntity> Columns
    110         {
    111             get { return m_columns; }
    112             set
    113             {
    114                 m_columns = value;
    115                 LoadColumns();
    116             }
    117         }
    118 
    119         private object m_dataSource;
    120         /// <summary>
    121         /// 数据源,支持列表或table,如果使用翻页控件,请使用翻页控件的DataSource
    122         /// </summary>
    123         [Description("数据源,支持列表或table,如果使用翻页控件,请使用翻页控件的DataSource"), Category("自定义")]
    124         public object DataSource
    125         {
    126             get { return m_dataSource; }
    127             set
    128             {
    129                 if (value == null)
    130                     return;
    131                 if (!(m_dataSource is DataTable) && (!typeof(IList).IsAssignableFrom(value.GetType())))
    132                 {
    133                     throw new Exception("数据源不是有效的数据类型,请使用Datatable或列表");
    134                 }
    135 
    136                 m_dataSource = value;
    137                 ReloadSource();
    138             }
    139         }
    140 
    141         public List<IDataGridViewRow> Rows { get; private set; }
    142 
    143         private Type m_rowType = typeof(UCDataGridViewRow);
    144         /// <summary>
    145         /// 行元素类型,默认UCDataGridViewItem
    146         /// </summary>
    147         [Description("行控件类型,默认UCDataGridViewRow,如果不满足请自定义行控件实现接口IDataGridViewRow"), Category("自定义")]
    148         public Type RowType
    149         {
    150             get { return m_rowType; }
    151             set
    152             {
    153                 if (value == null)
    154                     return;
    155                 if (!typeof(IDataGridViewRow).IsAssignableFrom(value) || !value.IsSubclassOf(typeof(Control)))
    156                     throw new Exception("行控件没有实现IDataGridViewRow接口");
    157                 m_rowType = value;
    158             }
    159         }
    160         IDataGridViewRow m_selectRow = null;
    161         /// <summary>
    162         /// 选中的节点
    163         /// </summary>
    164         [Description("选中行"), Category("自定义")]
    165         public IDataGridViewRow SelectRow
    166         {
    167             get { return m_selectRow; }
    168             private set { m_selectRow = value; }
    169         }
    170 
    171 
    172         /// <summary>
    173         /// 选中的行,如果显示CheckBox,则以CheckBox选中为准
    174         /// </summary>
    175         [Description("选中的行,如果显示CheckBox,则以CheckBox选中为准"), Category("自定义")]
    176         public List<IDataGridViewRow> SelectRows
    177         {
    178             get
    179             {
    180                 if (m_isShowCheckBox)
    181                 {
    182                     return Rows.FindAll(p => p.IsChecked);
    183                 }
    184                 else
    185                     return new List<IDataGridViewRow>() { m_selectRow };
    186             }
    187         }
    188 
    189 
    190         private UCPagerControlBase m_page = null;
    191         /// <summary>
    192         /// 翻页控件
    193         /// </summary>
    194         [Description("翻页控件,如果UCPagerControl不满足你的需求,请自定义翻页控件并继承UCPagerControlBase"), Category("自定义")]
    195         public UCPagerControlBase Page
    196         {
    197             get { return m_page; }
    198             set
    199             {
    200                 m_page = value;
    201                 if (value != null)
    202                 {
    203                     if (!typeof(IPageControl).IsAssignableFrom(value.GetType()) || !value.GetType().IsSubclassOf(typeof(UCPagerControlBase)))
    204                         throw new Exception("翻页控件没有继承UCPagerControlBase");
    205                     panPage.Visible = value != null;
    206                     m_page.ShowSourceChanged += page_ShowSourceChanged;
    207                     m_page.Dock = DockStyle.Fill;
    208                     this.panPage.Controls.Clear();
    209                     this.panPage.Controls.Add(m_page);
    210                     ResetShowCount();
    211                     m_page.PageSize = ShowCount;
    212                     this.DataSource = m_page.GetCurrentSource();
    213                 }
    214                 else
    215                 {
    216                     m_page = null;
    217                 }
    218             }
    219         }
    220 
    221         void page_ShowSourceChanged(object currentSource)
    222         {
    223             this.DataSource = currentSource;
    224         }
    225 
    226         #region 事件
    227         [Description("选中标题选择框事件"), Category("自定义")]
    228         public EventHandler HeadCheckBoxChangeEvent;
    229         [Description("标题点击事件"), Category("自定义")]
    230         public EventHandler HeadColumnClickEvent;
    231         [Description("项点击事件"), Category("自定义")]
    232         public event DataGridViewEventHandler ItemClick;
    233         [Description("数据源改变事件"), Category("自定义")]
    234         public event DataGridViewEventHandler SourceChanged;
    235         #endregion
    236         #endregion

    复制代码

    一些私有的方法

    复制代码

     1   #region 私有方法
     2         #region 加载column
     3         /// <summary>
     4         /// 功能描述:加载column
     5         /// 作  者:HZH
     6         /// 创建日期:2019-08-08 17:51:50
     7         /// 任务编号:POS
     8         /// </summary>
     9         private void LoadColumns()
    10         {
    11             try
    12             {
    13                 if (DesignMode)
    14                 { return; }
    15 
    16                 ControlHelper.FreezeControl(this.panHead, true);
    17                 this.panColumns.Controls.Clear();
    18                 this.panColumns.ColumnStyles.Clear();
    19 
    20                 if (m_columns != null && m_columns.Count() > 0)
    21                 {
    22                     int intColumnsCount = m_columns.Count();
    23                     if (m_isShowCheckBox)
    24                     {
    25                         intColumnsCount++;
    26                     }
    27                     this.panColumns.ColumnCount = intColumnsCount;
    28                     for (int i = 0; i < intColumnsCount; i++)
    29                     {
    30                         Control c = null;
    31                         if (i == 0 && m_isShowCheckBox)
    32                         {
    33                             this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F));
    34 
    35                             UCCheckBox box = new UCCheckBox();
    36                             box.TextValue = "";
    37                             box.Size = new Size(30, 30);
    38                             box.CheckedChangeEvent += (a, b) =>
    39                             {
    40                                 Rows.ForEach(p => p.IsChecked = box.Checked);
    41                                 if (HeadCheckBoxChangeEvent != null)
    42                                 {
    43                                     HeadCheckBoxChangeEvent(a, b);
    44                                 }
    45                             };
    46                             c = box;
    47                         }
    48                         else
    49                         {
    50                             var item = m_columns[i - (m_isShowCheckBox ? 1 : 0)];
    51                             this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width));
    52                             Label lbl = new Label();
    53                             lbl.Name = "dgvColumns_" + i;
    54                             lbl.Text = item.HeadText;
    55                             lbl.Font = m_headFont;
    56                             lbl.ForeColor = m_headTextColor;
    57                             lbl.TextAlign = ContentAlignment.MiddleCenter;
    58                             lbl.AutoSize = false;
    59                             lbl.Dock = DockStyle.Fill;
    60                             lbl.MouseDown += (a, b) =>
    61                             {
    62                                 if (HeadColumnClickEvent != null)
    63                                 {
    64                                     HeadColumnClickEvent(a, b);
    65                                 }
    66                             };
    67                             c = lbl;
    68                         }
    69                         this.panColumns.Controls.Add(c, i, 0);
    70                     }
    71 
    72                 }
    73             }
    74             finally
    75             {
    76                 ControlHelper.FreezeControl(this.panHead, false);
    77             }
    78         }
    79         #endregion
    80 
    81         /// <summary>
    82         /// 功能描述:获取显示个数
    83         /// 作  者:HZH
    84         /// 创建日期:2019-03-05 10:02:58
    85         /// 任务编号:POS
    86         /// </summary>
    87         /// <returns>返回值</returns>
    88         private void ResetShowCount()
    89         {
    90             if (DesignMode)
    91             { return; }
    92             ShowCount = this.panRow.Height / (m_rowHeight);
    93             int intCha = this.panRow.Height % (m_rowHeight);
    94             m_rowHeight += intCha / ShowCount;
    95         }
    96         #endregion

    复制代码

    几个事件

    复制代码

     1  #region 事件
     2         void RowSourceChanged(object sender, DataGridViewEventArgs e)
     3         {
     4             if (SourceChanged != null)
     5                 SourceChanged(sender, e);
     6         }
     7         private void SetSelectRow(Control item, DataGridViewEventArgs e)
     8         {
     9             try
    10             {
    11                 ControlHelper.FreezeControl(this, true);
    12                 if (item == null)
    13                     return;
    14                 if (item.Visible == false)
    15                     return;
    16                 this.FindForm().ActiveControl = this;
    17                 this.FindForm().ActiveControl = item;
    18                 if (m_selectRow != null)
    19                 {
    20                     if (m_selectRow == item)
    21                         return;
    22                     m_selectRow.SetSelect(false);
    23                 }
    24                 m_selectRow = item as IDataGridViewRow;
    25                 m_selectRow.SetSelect(true);
    26                 if (ItemClick != null)
    27                 {
    28                     ItemClick(item, e);
    29                 }
    30                 if (this.panRow.Controls.Count > 0)
    31                 {
    32                     if (item.Location.Y < 0)
    33                     {
    34                         this.panRow.AutoScrollPosition = new Point(0, Math.Abs(this.panRow.Controls[this.panRow.Controls.Count - 1].Location.Y) + item.Location.Y);
    35                     }
    36                     else if (item.Location.Y + m_rowHeight > this.panRow.Height)
    37                     {
    38                         this.panRow.AutoScrollPosition = new Point(0, Math.Abs(this.panRow.AutoScrollPosition.Y) + item.Location.Y - this.panRow.Height + m_rowHeight);
    39                     }
    40                 }
    41             }
    42             finally
    43             {
    44                 ControlHelper.FreezeControl(this, false);
    45             }
    46         }
    47         private void UCDataGridView_Resize(object sender, EventArgs e)
    48         {
    49             ResetShowCount();
    50             ReloadSource();
    51         }
    52         #endregion

    复制代码

    对外公开的函数

    复制代码

      1  #region 公共函数
      2         /// <summary>
      3         /// 刷新数据
      4         /// </summary>
      5         public void ReloadSource()
      6         {
      7             if (DesignMode)
      8             { return; }
      9             try
     10             {
     11                 if (m_columns == null || m_columns.Count <= 0)
     12                     return;
     13 
     14                 ControlHelper.FreezeControl(this.panRow, true);
     15                 this.panRow.Controls.Clear();
     16                 Rows = new List<IDataGridViewRow>();
     17                 if (m_dataSource != null)
     18                 {
     19                     int intIndex = 0;
     20                     Control lastItem = null;
     21 
     22                     int intSourceCount = 0;
     23                     if (m_dataSource is DataTable)
     24                     {
     25                         intSourceCount = (m_dataSource as DataTable).Rows.Count;
     26                     }
     27                     else if (typeof(IList).IsAssignableFrom(m_dataSource.GetType()))
     28                     {
     29                         intSourceCount = (m_dataSource as IList).Count;
     30                     }
     31 
     32                     foreach (Control item in this.panRow.Controls)
     33                     {
     34 
     35 
     36                         if (intIndex >= intSourceCount)
     37                         {
     38                             item.Visible = false;
     39                         }
     40                         else
     41                         {
     42                             var row = (item as IDataGridViewRow);
     43                             row.IsShowCheckBox = m_isShowCheckBox;
     44                             if (m_dataSource is DataTable)
     45                             {
     46                                 row.DataSource = (m_dataSource as DataTable).Rows[intIndex];
     47                             }
     48                             else
     49                             {
     50                                 row.DataSource = (m_dataSource as IList)[intIndex];
     51                             }
     52                             row.BindingCellData();
     53                             item.Height = m_rowHeight;
     54                             item.Visible = true;
     55                             item.BringToFront();
     56                             if (lastItem == null)
     57                                 lastItem = item;
     58                             Rows.Add(row);
     59                         }
     60                         intIndex++;
     61                     }
     62 
     63                     if (intIndex < intSourceCount)
     64                     {
     65                         for (int i = intIndex; i < intSourceCount; i++)
     66                         {
     67                             IDataGridViewRow row = (IDataGridViewRow)Activator.CreateInstance(m_rowType);
     68                             if (m_dataSource is DataTable)
     69                             {
     70                                 row.DataSource = (m_dataSource as DataTable).Rows[i];
     71                             }
     72                             else
     73                             {
     74                                 row.DataSource = (m_dataSource as IList)[i];
     75                             }
     76                             row.Columns = m_columns;
     77                             List<Control> lstCells = new List<Control>();
     78                             row.IsShowCheckBox = m_isShowCheckBox;
     79                             row.ReloadCells();
     80                             row.BindingCellData();
     81 
     82 
     83                             Control rowControl = (row as Control);
     84                             rowControl.Height = m_rowHeight;
     85                             this.panRow.Controls.Add(rowControl);
     86                             rowControl.Dock = DockStyle.Top;
     87                             row.CellClick += (a, b) => { SetSelectRow(rowControl, b); };
     88                             row.CheckBoxChangeEvent += (a, b) => { SetSelectRow(rowControl, b); };
     89                             row.SourceChanged += RowSourceChanged;
     90                             rowControl.BringToFront();
     91                             Rows.Add(row);
     92 
     93                             if (lastItem == null)
     94                                 lastItem = rowControl;
     95                         }
     96                     }
     97                     if (lastItem != null && intSourceCount == m_showCount)
     98                     {
     99                         lastItem.Height = this.panRow.Height - (m_showCount - 1) * m_rowHeight;
    100                     }
    101                 }
    102             }
    103             finally
    104             {
    105                 ControlHelper.FreezeControl(this.panRow, false);
    106             }
    107         }
    108 
    109 
    110         /// <summary>
    111         /// 快捷键
    112         /// </summary>
    113         /// <param name="msg"></param>
    114         /// <param name="keyData"></param>
    115         /// <returns></returns>
    116         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    117         {
    118             if (keyData == Keys.Up)
    119             {
    120                 Previous();
    121             }
    122             else if (keyData == Keys.Down)
    123             {
    124                 Next();
    125             }
    126             else if (keyData == Keys.Home)
    127             {
    128                 First();
    129             }
    130             else if (keyData == Keys.End)
    131             {
    132                 End();
    133             }
    134             return base.ProcessCmdKey(ref msg, keyData);
    135         }
    136         /// <summary>
    137         /// 选中第一个
    138         /// </summary>
    139         public void First()
    140         {
    141             if (Rows == null || Rows.Count <= 0)
    142                 return;
    143             Control c = null;
    144             c = (Rows[0] as Control);
    145             SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = 0 });
    146         }
    147         /// <summary>
    148         /// 选中上一个
    149         /// </summary>
    150         public void Previous()
    151         {
    152             if (Rows == null || Rows.Count <= 0)
    153                 return;
    154             Control c = null;
    155 
    156             int index = Rows.IndexOf(m_selectRow);
    157             if (index - 1 >= 0)
    158             {
    159                 c = (Rows[index - 1] as Control);
    160                 SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = index - 1 });
    161             }
    162         }
    163         /// <summary>
    164         /// 选中下一个
    165         /// </summary>
    166         public void Next()
    167         {
    168             if (Rows == null || Rows.Count <= 0)
    169                 return;
    170             Control c = null;
    171 
    172             int index = Rows.IndexOf(m_selectRow);
    173             if (index + 1 < Rows.Count)
    174             {
    175                 c = (Rows[index + 1] as Control);
    176                 SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = index + 1 });
    177             }
    178         }
    179         /// <summary>
    180         /// 选中最后一个
    181         /// </summary>
    182         public void End()
    183         {
    184             if (Rows == null || Rows.Count <= 0)
    185                 return;
    186             Control c = null;
    187             c = (Rows[Rows.Count - 1] as Control);
    188             SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = Rows.Count - 1 });
    189         }
    190 
    191         #endregion

    复制代码

    完整代码

    // 版权所有  黄正辉  交流群:568015492   QQ:623128629
    // 文件名称:UCDataGridView.cs
    // 创建日期:2019-08-15 15:59:25
    // 功能描述:DataGridView
    // 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;
    
    namespace HZH_Controls.Controls
    {
        public partial class UCDataGridView : UserControl
        {
            #region 属性
            private Font m_headFont = new Font("微软雅黑", 12F);
            /// <summary>
            /// 标题字体
            /// </summary>
            [Description("标题字体"), Category("自定义")]
            public Font HeadFont
            {
                get { return m_headFont; }
                set { m_headFont = value; }
            }
            private Color m_headTextColor = Color.Black;
            /// <summary>
            /// 标题字体颜色
            /// </summary>
            [Description("标题文字颜色"), Category("自定义")]
            public Color HeadTextColor
            {
                get { return m_headTextColor; }
                set { m_headTextColor = value; }
            }
    
            private bool m_isShowHead = true;
            /// <summary>
            /// 是否显示标题
            /// </summary>
            [Description("是否显示标题"), Category("自定义")]
            public bool IsShowHead
            {
                get { return m_isShowHead; }
                set
                {
                    m_isShowHead = value;
                    panHead.Visible = value;
                    if (m_page != null)
                    {
                        ResetShowCount();
                        m_page.PageSize = m_showCount;
                    }
                }
            }
            private int m_headHeight = 40;
            /// <summary>
            /// 标题高度
            /// </summary>
            [Description("标题高度"), Category("自定义")]
            public int HeadHeight
            {
                get { return m_headHeight; }
                set
                {
                    m_headHeight = value;
                    panHead.Height = value;
                }
            }
    
            private bool m_isShowCheckBox = false;
            /// <summary>
            /// 是否显示复选框
            /// </summary>
            [Description("是否显示选择框"), Category("自定义")]
            public bool IsShowCheckBox
            {
                get { return m_isShowCheckBox; }
                set
                {
                    if (value != m_isShowCheckBox)
                    {
                        m_isShowCheckBox = value;
                        LoadColumns();
                    }
                }
            }
    
            private int m_rowHeight = 40;
            /// <summary>
            /// 行高
            /// </summary>
            [Description("数据行高"), Category("自定义")]
            public int RowHeight
            {
                get { return m_rowHeight; }
                set { m_rowHeight = value; }
            }
    
            private int m_showCount = 0;
            /// <summary>
            /// 
            /// </summary>
            [Description("可显示个数"), Category("自定义")]
            public int ShowCount
            {
                get { return m_showCount; }
                private set
                {
                    m_showCount = value;
                    if (m_page != null)
                    {
                        m_page.PageSize = value;
                    }
                }
            }
    
            private List<DataGridViewColumnEntity> m_columns;
            /// <summary>
            /// 列
            /// </summary>
            [Description("列"), Category("自定义")]
            public List<DataGridViewColumnEntity> Columns
            {
                get { return m_columns; }
                set
                {
                    m_columns = value;
                    LoadColumns();
                }
            }
    
            private object m_dataSource;
            /// <summary>
            /// 数据源,支持列表或table,如果使用翻页控件,请使用翻页控件的DataSource
            /// </summary>
            [Description("数据源,支持列表或table,如果使用翻页控件,请使用翻页控件的DataSource"), Category("自定义")]
            public object DataSource
            {
                get { return m_dataSource; }
                set
                {
                    if (value == null)
                        return;
                    if (!(m_dataSource is DataTable) && (!typeof(IList).IsAssignableFrom(value.GetType())))
                    {
                        throw new Exception("数据源不是有效的数据类型,请使用Datatable或列表");
                    }
    
                    m_dataSource = value;
                    ReloadSource();
                }
            }
    
            public List<IDataGridViewRow> Rows { get; private set; }
    
            private Type m_rowType = typeof(UCDataGridViewRow);
            /// <summary>
            /// 行元素类型,默认UCDataGridViewItem
            /// </summary>
            [Description("行控件类型,默认UCDataGridViewRow,如果不满足请自定义行控件实现接口IDataGridViewRow"), Category("自定义")]
            public Type RowType
            {
                get { return m_rowType; }
                set
                {
                    if (value == null)
                        return;
                    if (!typeof(IDataGridViewRow).IsAssignableFrom(value) || !value.IsSubclassOf(typeof(Control)))
                        throw new Exception("行控件没有实现IDataGridViewRow接口");
                    m_rowType = value;
                }
            }
            IDataGridViewRow m_selectRow = null;
            /// <summary>
            /// 选中的节点
            /// </summary>
            [Description("选中行"), Category("自定义")]
            public IDataGridViewRow SelectRow
            {
                get { return m_selectRow; }
                private set { m_selectRow = value; }
            }
    
    
            /// <summary>
            /// 选中的行,如果显示CheckBox,则以CheckBox选中为准
            /// </summary>
            [Description("选中的行,如果显示CheckBox,则以CheckBox选中为准"), Category("自定义")]
            public List<IDataGridViewRow> SelectRows
            {
                get
                {
                    if (m_isShowCheckBox)
                    {
                        return Rows.FindAll(p => p.IsChecked);
                    }
                    else
                        return new List<IDataGridViewRow>() { m_selectRow };
                }
            }
    
    
            private UCPagerControlBase m_page = null;
            /// <summary>
            /// 翻页控件
            /// </summary>
            [Description("翻页控件,如果UCPagerControl不满足你的需求,请自定义翻页控件并继承UCPagerControlBase"), Category("自定义")]
            public UCPagerControlBase Page
            {
                get { return m_page; }
                set
                {
                    m_page = value;
                    if (value != null)
                    {
                        if (!typeof(IPageControl).IsAssignableFrom(value.GetType()) || !value.GetType().IsSubclassOf(typeof(UCPagerControlBase)))
                            throw new Exception("翻页控件没有继承UCPagerControlBase");
                        panPage.Visible = value != null;
                        m_page.ShowSourceChanged += page_ShowSourceChanged;
                        m_page.Dock = DockStyle.Fill;
                        this.panPage.Controls.Clear();
                        this.panPage.Controls.Add(m_page);
                        ResetShowCount();
                        m_page.PageSize = ShowCount;
                        this.DataSource = m_page.GetCurrentSource();
                    }
                    else
                    {
                        m_page = null;
                    }
                }
            }
    
            void page_ShowSourceChanged(object currentSource)
            {
                this.DataSource = currentSource;
            }
    
            #region 事件
            [Description("选中标题选择框事件"), Category("自定义")]
            public EventHandler HeadCheckBoxChangeEvent;
            [Description("标题点击事件"), Category("自定义")]
            public EventHandler HeadColumnClickEvent;
            [Description("项点击事件"), Category("自定义")]
            public event DataGridViewEventHandler ItemClick;
            [Description("数据源改变事件"), Category("自定义")]
            public event DataGridViewEventHandler SourceChanged;
            #endregion
            #endregion
    
            public UCDataGridView()
            {
                InitializeComponent();
            }
    
            #region 私有方法
            #region 加载column
            /// <summary>
            /// 功能描述:加载column
            /// 作  者:HZH
            /// 创建日期:2019-08-08 17:51:50
            /// 任务编号:POS
            /// </summary>
            private void LoadColumns()
            {
                try
                {
                    if (DesignMode)
                    { return; }
    
                    ControlHelper.FreezeControl(this.panHead, true);
                    this.panColumns.Controls.Clear();
                    this.panColumns.ColumnStyles.Clear();
    
                    if (m_columns != null && m_columns.Count() > 0)
                    {
                        int intColumnsCount = m_columns.Count();
                        if (m_isShowCheckBox)
                        {
                            intColumnsCount++;
                        }
                        this.panColumns.ColumnCount = intColumnsCount;
                        for (int i = 0; i < intColumnsCount; i++)
                        {
                            Control c = null;
                            if (i == 0 && m_isShowCheckBox)
                            {
                                this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F));
    
                                UCCheckBox box = new UCCheckBox();
                                box.TextValue = "";
                                box.Size = new Size(30, 30);
                                box.CheckedChangeEvent += (a, b) =>
                                {
                                    Rows.ForEach(p => p.IsChecked = box.Checked);
                                    if (HeadCheckBoxChangeEvent != null)
                                    {
                                        HeadCheckBoxChangeEvent(a, b);
                                    }
                                };
                                c = box;
                            }
                            else
                            {
                                var item = m_columns[i - (m_isShowCheckBox ? 1 : 0)];
                                this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width));
                                Label lbl = new Label();
                                lbl.Name = "dgvColumns_" + i;
                                lbl.Text = item.HeadText;
                                lbl.Font = m_headFont;
                                lbl.ForeColor = m_headTextColor;
                                lbl.TextAlign = ContentAlignment.MiddleCenter;
                                lbl.AutoSize = false;
                                lbl.Dock = DockStyle.Fill;
                                lbl.MouseDown += (a, b) =>
                                {
                                    if (HeadColumnClickEvent != null)
                                    {
                                        HeadColumnClickEvent(a, b);
                                    }
                                };
                                c = lbl;
                            }
                            this.panColumns.Controls.Add(c, i, 0);
                        }
    
                    }
                }
                finally
                {
                    ControlHelper.FreezeControl(this.panHead, false);
                }
            }
            #endregion
    
            /// <summary>
            /// 功能描述:获取显示个数
            /// 作  者:HZH
            /// 创建日期:2019-03-05 10:02:58
            /// 任务编号:POS
            /// </summary>
            /// <returns>返回值</returns>
            private void ResetShowCount()
            {
                if (DesignMode)
                { return; }
                ShowCount = this.panRow.Height / (m_rowHeight);
                int intCha = this.panRow.Height % (m_rowHeight);
                m_rowHeight += intCha / ShowCount;
            }
            #endregion
    
            #region 公共函数
            /// <summary>
            /// 刷新数据
            /// </summary>
            public void ReloadSource()
            {
                if (DesignMode)
                { return; }
                try
                {
                    if (m_columns == null || m_columns.Count <= 0)
                        return;
    
                    ControlHelper.FreezeControl(this.panRow, true);
                    this.panRow.Controls.Clear();
                    Rows = new List<IDataGridViewRow>();
                    if (m_dataSource != null)
                    {
                        int intIndex = 0;
                        Control lastItem = null;
    
                        int intSourceCount = 0;
                        if (m_dataSource is DataTable)
                        {
                            intSourceCount = (m_dataSource as DataTable).Rows.Count;
                        }
                        else if (typeof(IList).IsAssignableFrom(m_dataSource.GetType()))
                        {
                            intSourceCount = (m_dataSource as IList).Count;
                        }
    
                        foreach (Control item in this.panRow.Controls)
                        {
    
    
                            if (intIndex >= intSourceCount)
                            {
                                item.Visible = false;
                            }
                            else
                            {
                                var row = (item as IDataGridViewRow);
                                row.IsShowCheckBox = m_isShowCheckBox;
                                if (m_dataSource is DataTable)
                                {
                                    row.DataSource = (m_dataSource as DataTable).Rows[intIndex];
                                }
                                else
                                {
                                    row.DataSource = (m_dataSource as IList)[intIndex];
                                }
                                row.BindingCellData();
                                item.Height = m_rowHeight;
                                item.Visible = true;
                                item.BringToFront();
                                if (lastItem == null)
                                    lastItem = item;
                                Rows.Add(row);
                            }
                            intIndex++;
                        }
    
                        if (intIndex < intSourceCount)
                        {
                            for (int i = intIndex; i < intSourceCount; i++)
                            {
                                IDataGridViewRow row = (IDataGridViewRow)Activator.CreateInstance(m_rowType);
                                if (m_dataSource is DataTable)
                                {
                                    row.DataSource = (m_dataSource as DataTable).Rows[i];
                                }
                                else
                                {
                                    row.DataSource = (m_dataSource as IList)[i];
                                }
                                row.Columns = m_columns;
                                List<Control> lstCells = new List<Control>();
                                row.IsShowCheckBox = m_isShowCheckBox;
                                row.ReloadCells();
                                row.BindingCellData();
    
    
                                Control rowControl = (row as Control);
                                rowControl.Height = m_rowHeight;
                                this.panRow.Controls.Add(rowControl);
                                rowControl.Dock = DockStyle.Top;
                                row.CellClick += (a, b) => { SetSelectRow(rowControl, b); };
                                row.CheckBoxChangeEvent += (a, b) => { SetSelectRow(rowControl, b); };
                                row.SourceChanged += RowSourceChanged;
                                rowControl.BringToFront();
                                Rows.Add(row);
    
                                if (lastItem == null)
                                    lastItem = rowControl;
                            }
                        }
                        if (lastItem != null && intSourceCount == m_showCount)
                        {
                            lastItem.Height = this.panRow.Height - (m_showCount - 1) * m_rowHeight;
                        }
                    }
                }
                finally
                {
                    ControlHelper.FreezeControl(this.panRow, false);
                }
            }
    
    
            /// <summary>
            /// 快捷键
            /// </summary>
            /// <param name="msg"></param>
            /// <param name="keyData"></param>
            /// <returns></returns>
            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (keyData == Keys.Up)
                {
                    Previous();
                }
                else if (keyData == Keys.Down)
                {
                    Next();
                }
                else if (keyData == Keys.Home)
                {
                    First();
                }
                else if (keyData == Keys.End)
                {
                    End();
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
            /// <summary>
            /// 选中第一个
            /// </summary>
            public void First()
            {
                if (Rows == null || Rows.Count <= 0)
                    return;
                Control c = null;
                c = (Rows[0] as Control);
                SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = 0 });
            }
            /// <summary>
            /// 选中上一个
            /// </summary>
            public void Previous()
            {
                if (Rows == null || Rows.Count <= 0)
                    return;
                Control c = null;
    
                int index = Rows.IndexOf(m_selectRow);
                if (index - 1 >= 0)
                {
                    c = (Rows[index - 1] as Control);
                    SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = index - 1 });
                }
            }
            /// <summary>
            /// 选中下一个
            /// </summary>
            public void Next()
            {
                if (Rows == null || Rows.Count <= 0)
                    return;
                Control c = null;
    
                int index = Rows.IndexOf(m_selectRow);
                if (index + 1 < Rows.Count)
                {
                    c = (Rows[index + 1] as Control);
                    SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = index + 1 });
                }
            }
            /// <summary>
            /// 选中最后一个
            /// </summary>
            public void End()
            {
                if (Rows == null || Rows.Count <= 0)
                    return;
                Control c = null;
                c = (Rows[Rows.Count - 1] as Control);
                SetSelectRow(c, new DataGridViewEventArgs() { RowIndex = Rows.Count - 1 });
            }
    
            #endregion
    
            #region 事件
            void RowSourceChanged(object sender, DataGridViewEventArgs e)
            {
                if (SourceChanged != null)
                    SourceChanged(sender, e);
            }
            private void SetSelectRow(Control item, DataGridViewEventArgs e)
            {
                try
                {
                    ControlHelper.FreezeControl(this, true);
                    if (item == null)
                        return;
                    if (item.Visible == false)
                        return;
                    this.FindForm().ActiveControl = this;
                    this.FindForm().ActiveControl = item;
                    if (m_selectRow != null)
                    {
                        if (m_selectRow == item)
                            return;
                        m_selectRow.SetSelect(false);
                    }
                    m_selectRow = item as IDataGridViewRow;
                    m_selectRow.SetSelect(true);
                    if (ItemClick != null)
                    {
                        ItemClick(item, e);
                    }
                    if (this.panRow.Controls.Count > 0)
                    {
                        if (item.Location.Y < 0)
                        {
                            this.panRow.AutoScrollPosition = new Point(0, Math.Abs(this.panRow.Controls[this.panRow.Controls.Count - 1].Location.Y) + item.Location.Y);
                        }
                        else if (item.Location.Y + m_rowHeight > this.panRow.Height)
                        {
                            this.panRow.AutoScrollPosition = new Point(0, Math.Abs(this.panRow.AutoScrollPosition.Y) + item.Location.Y - this.panRow.Height + m_rowHeight);
                        }
                    }
                }
                finally
                {
                    ControlHelper.FreezeControl(this, false);
                }
            }
            private void UCDataGridView_Resize(object sender, EventArgs e)
            {
                ResetShowCount();
                ReloadSource();
            }
            #endregion
        }
    }
    namespace HZH_Controls.Controls
    {
        partial class UCDataGridView
        {
            /// <summary> 
            /// 必需的设计器变量。
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary> 
            /// 清理所有正在使用的资源。
            /// </summary>
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region 组件设计器生成的代码
    
            /// <summary> 
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                this.panHead = new System.Windows.Forms.Panel();
                this.panColumns = new System.Windows.Forms.TableLayoutPanel();
                this.ucSplitLine_H1 = new HZH_Controls.Controls.UCSplitLine_H();
                this.panRow = new System.Windows.Forms.Panel();
                this.panPage = new System.Windows.Forms.Panel();
                this.panHead.SuspendLayout();
                this.SuspendLayout();
                // 
                // panHead
                // 
                this.panHead.Controls.Add(this.panColumns);
                this.panHead.Controls.Add(this.ucSplitLine_H1);
                this.panHead.Dock = System.Windows.Forms.DockStyle.Top;
                this.panHead.Location = new System.Drawing.Point(0, 0);
                this.panHead.Name = "panHead";
                this.panHead.Size = new System.Drawing.Size(1061, 40);
                this.panHead.TabIndex = 0;
                // 
                // panColumns
                // 
                this.panColumns.ColumnCount = 1;
                this.panColumns.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
                this.panColumns.Dock = System.Windows.Forms.DockStyle.Fill;
                this.panColumns.Location = new System.Drawing.Point(0, 0);
                this.panColumns.Name = "panColumns";
                this.panColumns.RowCount = 1;
                this.panColumns.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
                this.panColumns.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
                this.panColumns.Size = new System.Drawing.Size(1061, 39);
                this.panColumns.TabIndex = 1;
                // 
                // ucSplitLine_H1
                // 
                this.ucSplitLine_H1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232)))));
                this.ucSplitLine_H1.Dock = System.Windows.Forms.DockStyle.Bottom;
                this.ucSplitLine_H1.Location = new System.Drawing.Point(0, 39);
                this.ucSplitLine_H1.Name = "ucSplitLine_H1";
                this.ucSplitLine_H1.Size = new System.Drawing.Size(1061, 1);
                this.ucSplitLine_H1.TabIndex = 0;
                this.ucSplitLine_H1.TabStop = false;
                // 
                // panRow
                // 
                this.panRow.AutoScroll = true;
                this.panRow.Dock = System.Windows.Forms.DockStyle.Fill;
                this.panRow.Location = new System.Drawing.Point(0, 40);
                this.panRow.Name = "panRow";
                this.panRow.Size = new System.Drawing.Size(1061, 475);
                this.panRow.TabIndex = 1;
                // 
                // panPage
                // 
                this.panPage.Dock = System.Windows.Forms.DockStyle.Bottom;
                this.panPage.Location = new System.Drawing.Point(0, 515);
                this.panPage.Name = "panPage";
                this.panPage.Size = new System.Drawing.Size(1061, 50);
                this.panPage.TabIndex = 0;
                this.panPage.Visible = false;
                // 
                // UCDataGridView
                // 
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
                this.BackColor = System.Drawing.Color.White;
                this.Controls.Add(this.panRow);
                this.Controls.Add(this.panPage);
                this.Controls.Add(this.panHead);
                this.Name = "UCDataGridView";
                this.Size = new System.Drawing.Size(1061, 565);
                this.Resize += new System.EventHandler(this.UCDataGridView_Resize);
                this.panHead.ResumeLayout(false);
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
            private System.Windows.Forms.Panel panHead;
            private System.Windows.Forms.TableLayoutPanel panColumns;
            private UCSplitLine_H ucSplitLine_H1;
            private System.Windows.Forms.Panel panRow;
            private System.Windows.Forms.Panel panPage;
    
        }
    }

    如果你仔细看,你会发现行我用了类型进行传入,当你需要更丰富的行内容的时候,可以自定义行控件,然后通过RowType属性传入

    分页控件我使用了分页控件基类UCPagerControlBase,这样做的好处就是你同样可以扩展分页控件

    用处及效果

    调用示例

    复制代码

     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 = 50, WidthType = SizeType.Percent });
     4             lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Age", HeadText = "年龄", Width = 50, WidthType = SizeType.Percent });
     5             lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Birthday", HeadText = "生日", Width = 50, WidthType = SizeType.Percent, Format = (a) => { return ((DateTime)a).ToString("yyyy-MM-dd"); } });
     6             lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Sex", HeadText = "性别", Width = 50, WidthType = SizeType.Percent, Format = (a) => { return ((int)a) == 0 ? "女" : "男"; } });
     7             this.ucDataGridView1.Columns = lstCulumns;
     8             this.ucDataGridView1.IsShowCheckBox = true;
     9             List<object> lstSource = new List<object>();
    10             for (int i = 0; i < 200; i++)
    11             {
    12                 TestModel model = new TestModel()
    13                 {
    14                     ID = i.ToString(),
    15                     Age = 3 * i,
    16                     Name = "姓名——" + i,
    17                     Birthday = DateTime.Now.AddYears(-10),
    18                     Sex = i % 2
    19                 };
    20                 lstSource.Add(model);
    21             }
    22 
    23             var page = new UCPagerControl2();
    24             page.DataSource = lstSource;
    25             this.ucDataGridView1.Page = page;
    26             this.ucDataGridView1.First();

    复制代码

    如果使用分页控件,则将数据源指定给分页控件,否则直接指定给表格控件数据源

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星 星吧

    展开全文
  • c#Winform自定义控件-目录

    千次阅读 多人点赞 2019-09-06 20:59:24
    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果...

    官网:

    http://hzhcontrols.com/

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

     

     ~~~持续增加中~~~~~

     

    自定义控件

    (一)c#Winform自定义控件-基类控件

    (二)c#Winform自定义控件-按钮

    (三)c#Winform自定义控件-有图标的按钮

    (四)c#Winform自定义控件-选择按钮组

    (五)c#Winform自定义控件-复选框

    (六)c#Winform自定义控件-单选框

    (七)c#Winform自定义控件-进度条

    (八)c#Winform自定义控件-分割线

    (九)c#Winform自定义控件-树

    (十)c#Winform自定义控件-横向列表

    (十一)c#Winform自定义控件-列表

    (十二)c#Winform自定义控件-分页控件

    (十三)c#Winform自定义控件-导航菜单

    (十四)c#Winform自定义控件-键盘(一)

    (十五)c#Winform自定义控件-键盘(二)

    (十六)c#Winform自定义控件-文本框哪里去了?

    (二十八)c#Winform自定义控件-文本框(一)

    (二十九)c#Winform自定义控件-文本框(二)

    (三十)c#Winform自定义控件-文本框(三)

    (三十一)c#Winform自定义控件-文本框(四)

    (三十二)c#Winform自定义控件-表格

    (三十三)c#Winform自定义控件-日期控件

    (三十四)c#Winform自定义控件-Tab页

    (三十五)c#Winform自定义控件-下拉框

    (三十六)c#Winform自定义控件-步骤控件

    (三十七)c#Winform自定义控件-有标题的面板

    (三十八)c#Winform自定义控件-圆形进度条

    (三十九)c#Winform自定义控件-面包屑导航

    (四十)c#Winform自定义控件-开关

    (四十一)c#Winform自定义控件-进度条

    (四十二)c#Winform自定义控件-进度条扩展

    (四十三)c#Winform自定义控件-Listview

    (四十四)c#Winform自定义控件-水波

    (四十五)c#Winform自定义控件-水波图表

    (四十六)c#Winform自定义控件-水波进度条

    (四十七)c#Winform自定义控件-树表格(treeGrid)

    (四十八)c#Winform自定义控件-下拉按钮

    (四十九)c#Winform自定义控件-下拉框(表格)

    (五十)c#Winform自定义控件-滑块

    (五十一)c#Winform自定义控件-文字提示

    (五十二)c#Winform自定义控件-LED数字

    (五十三)c#Winform自定义控件-滚动文字

    (五十四)c#Winform自定义控件-仪表盘

    (五十五)c#Winform自定义控件-管道(工业)

    (五十六)c#Winform自定义控件-瓶子(工业)

    (五十七)c#Winform自定义控件-传送带(工业)

    (五十八)c#Winform自定义控件-管道阀门(工业)

    (五十九)c#Winform自定义控件-池子(工业)

    (六十)c#Winform自定义控件-鼓风机(工业)

    (六十一)c#Winform自定义控件-信号灯(工业)

    (六十二)c#Winform自定义控件-警灯(工业)

    (六十三)c#Winform自定义控件-箭头(工业)

    (六十四)c#Winform自定义控件-温度计(工业)

    (六十五)c#Winform自定义控件-思维导图/组织架构图(工业)

    (六十六)c#Winform自定义控件-图标

    (六十七)c#Winform自定义控件-柱状图

    (六十八)c#Winform自定义控件-DEMO整理

    (六十九)c#Winform自定义控件-垂直滚动条

    (七十)c#Winform自定义控件-饼状图

    (七十一)c#Winform自定义控件-折线图

    (七十二)c#Winform自定义控件-雷达图

    (七十四)c#Winform自定义控件-金字塔图表

     (七十五)c#Winform自定义控件-控件水印组件

    (七十六)c#Winform自定义控件-表单验证组件

    (七十七)c#Winform自定义控件-采样控件

    (七十八)c#Winform自定义控件-倒影组件

    (七十九)c#Winform自定义控件-导航菜单

    (八十)c#Winform自定义控件-分割线标签

    (八十一)c#Winform自定义控件-时间轴

    (八十二)c#Winform自定义控件-穿梭框

    (八十三)c#Winform自定义控件-导航菜单(扩展)

    (八十四)c#Winform自定义控件-导航菜单(类Office菜单)

    (八十五)c#Winform自定义控件-引用区块

    自定义窗体

    (十七)c#Winform自定义控件-基类窗体

    (十八)c#Winform自定义控件-提示框

    (十九)c#Winform自定义控件-停靠窗体

    (二十)c#Winform自定义控件-有后退的窗体

    (二十一)c#Winform自定义控件-气泡提示

    (二十二)c#Winform自定义控件-半透明窗体

    (二十三)c#Winform自定义控件-等待窗体

    (二十四)c#Winform自定义控件-单标题窗体

    (二十五)c#Winform自定义控件-有确定取消的窗体(一)

    (二十六)c#Winform自定义控件-有确定取消的窗体(二)

    (二十七)c#Winform自定义控件-多输入窗体

    (七十三)c#Winform自定义控件-资源加载窗体

    效果图

     

     

     

     

     

     

    展开全文
  • (十一)c#Winform自定义控件-列表

    千次阅读 2019-09-06 21:39:50
    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果...

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    目录

    https://blog.csdn.net/kwwwvagaa/article/details/100586547

    准备工作

    列表控件将被拆分为2部分,一个元素,一个列表,列表需要支持主副标题,图标等

    开始

    首先定义一个数据源类(其实更好的是应该接受object,然后通过绑定字段反射绑定数据,这样就不需要这个数据源类了,这里偷懒了)

    /// <summary>
        /// 列表实体
        /// </summary>
        [Serializable]
        public class ListEntity
        {
            /// <summary>
            /// 编码,唯一值
            /// </summary>
            public string ID { get; set; }
            /// <summary>
            /// 大标题
            /// </summary>
            public string Title { get; set; }
            /// <summary>
            /// 右侧更多按钮
            /// </summary>
            public bool ShowMoreBtn { get; set; }
            /// <summary>
            /// 右侧副标题
            /// </summary>
            public string Title2 { get; set; }
            /// <summary>
            /// 关联的数据源
            /// </summary>
            public object Source { get; set; }
        }

    我们创建元素控件,添加一个用户控件,命名UCListItemExt

    需要提供一下属性

    [Description("标题"), Category("自定义")]
            public string Title
            {
                get { return label1.Text; }
                set { label1.Text = value; }
            }
            [Description("副标题"), Category("自定义")]
            public string Title2
            {
                get { return label3.Text; }
                set
                {
                    label3.Text = value;
                    label3.Visible = !string.IsNullOrEmpty(value);
                }
            }
    
            [Description("标题字体"), Category("自定义")]
            public Font TitleFont
            {
                get { return label1.Font; }
                set
                {
                    label1.Font = value;
                }
            }
    
            [Description("副标题字体"), Category("自定义")]
            public Font Title2Font
            {
                get { return label3.Font; }
                set
                {
                    label3.Font = value;
                }
            }
    
            [Description("背景色"), Category("自定义")]
            public Color ItemBackColor
            {
                get { return this.BackColor; }
                set
                {
                    this.BackColor = value;
                }
            }
    
            [Description("标题文本色"), Category("自定义")]
            public Color ItemForeColor
            {
                get { return label1.ForeColor; }
                set { label1.ForeColor = value; }
            }
    
            [Description("副标题文本色"), Category("自定义")]
            public Color ItemForeColor2
            {
                get { return label3.ForeColor; }
                set { label3.ForeColor = value; }
            }
    
            [Description("是否显示右侧更多箭头"), Category("自定义")]
            public bool ShowMoreBtn
            {
                get { return label2.Visible; }
                set { label2.Visible = value; ; }
            }
    
            [Description("项选中事件"), Category("自定义")]
            public event EventHandler ItemClick;
    
            /// <summary>
            /// 数据源
            /// </summary>
            public ListEntity DataSource { get; private set; }

    开放一个对外的设置数据源入口

    #region 设置数据
            /// <summary>
            /// 功能描述:设置数据
            /// 作  者:HZH
            /// 创建日期:2019-02-27 11:52:52
            /// 任务编号:POS
            /// </summary>
            /// <param name="data">data</param>
            public void SetData(ListEntity data)
            {
                this.Title = data.Title;
                this.Title2 = data.Title2;
                this.ShowMoreBtn = data.ShowMoreBtn;
                DataSource = data;
            }
            #endregion

    再处理一下点击事件

    private void item_MouseDown(object sender, MouseEventArgs e)
            {
                if (ItemClick != null)
                {
                    ItemClick(this, e);
                }
            }

    至此功能完成,看下完整代码

    // 版权所有  黄正辉  交流群:568015492   QQ:623128629
    // 文件名称:UCListItemExt.cs
    // 创建日期:2019-08-15 16:01:34
    // 功能描述:List
    // 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace HZH_Controls.Controls
    {
        [ToolboxItem(false)]
        public partial class UCListItemExt : UserControl
        {
            [Description("标题"), Category("自定义")]
            public string Title
            {
                get { return label1.Text; }
                set { label1.Text = value; }
            }
            [Description("副标题"), Category("自定义")]
            public string Title2
            {
                get { return label3.Text; }
                set
                {
                    label3.Text = value;
                    label3.Visible = !string.IsNullOrEmpty(value);
                }
            }
    
            [Description("标题字体"), Category("自定义")]
            public Font TitleFont
            {
                get { return label1.Font; }
                set
                {
                    label1.Font = value;
                }
            }
    
            [Description("副标题字体"), Category("自定义")]
            public Font Title2Font
            {
                get { return label3.Font; }
                set
                {
                    label3.Font = value;
                }
            }
    
            [Description("背景色"), Category("自定义")]
            public Color ItemBackColor
            {
                get { return this.BackColor; }
                set
                {
                    this.BackColor = value;
                }
            }
    
            [Description("标题文本色"), Category("自定义")]
            public Color ItemForeColor
            {
                get { return label1.ForeColor; }
                set { label1.ForeColor = value; }
            }
    
            [Description("副标题文本色"), Category("自定义")]
            public Color ItemForeColor2
            {
                get { return label3.ForeColor; }
                set { label3.ForeColor = value; }
            }
    
            [Description("是否显示右侧更多箭头"), Category("自定义")]
            public bool ShowMoreBtn
            {
                get { return label2.Visible; }
                set { label2.Visible = value; ; }
            }
    
            [Description("项选中事件"), Category("自定义")]
            public event EventHandler ItemClick;
    
            /// <summary>
            /// 数据源
            /// </summary>
            public ListEntity DataSource { get; private set; }
    
            public UCListItemExt()
            {
                InitializeComponent();
                SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
                this.UpdateStyles();
            }
    
            private void item_MouseDown(object sender, MouseEventArgs e)
            {
                if (ItemClick != null)
                {
                    ItemClick(this, e);
                }
            }
    
            #region 设置数据
            /// <summary>
            /// 功能描述:设置数据
            /// 作  者:HZH
            /// 创建日期:2019-02-27 11:52:52
            /// 任务编号:POS
            /// </summary>
            /// <param name="data">data</param>
            public void SetData(ListEntity data)
            {
                this.Title = data.Title;
                this.Title2 = data.Title2;
                this.ShowMoreBtn = data.ShowMoreBtn;
                DataSource = data;
            }
            #endregion
        }
    }

    设计样式如下

     

    接着我们需要创建列表控件,添加用户控件,命名UCListExt

    看下需要哪些属性

    private Font _titleFont = new Font("微软雅黑", 15F);
            [Description("标题字体"), Category("自定义")]
            public Font TitleFont
            {
                get { return _titleFont; }
                set { _titleFont = value; }
            }
            private Font _title2Font = new Font("微软雅黑", 14F);
            [Description("副标题字体"), Category("自定义")]
            public Font Title2Font
            {
                get { return _title2Font; }
                set { _title2Font = value; }
            }
    
            private Color _itemBackColor = Color.White;
            [Description("标题背景色"), Category("自定义")]
            public Color ItemBackColor
            {
                get { return _itemBackColor; }
                set { _itemBackColor = value; }
            }
    
            private Color _itemSelectedBackColor = Color.FromArgb(73, 119, 232);
    
            [Description("标题选中背景色"), Category("自定义")]
            public Color ItemSelectedBackColor
            {
                get { return _itemSelectedBackColor; }
                set { _itemSelectedBackColor = value; }
            }
    
            private Color _itemForeColor = Color.Black;
    
            [Description("标题文本色"), Category("自定义")]
            public Color ItemForeColor
            {
                get { return _itemForeColor; }
                set { _itemForeColor = value; }
            }
            private Color _itemSelectedForeColor = Color.White;
    
            [Description("标题选中文本色"), Category("自定义")]
            public Color ItemSelectedForeColor
            {
                get { return _itemSelectedForeColor; }
                set { _itemSelectedForeColor = value; }
            }
            private Color _itemForeColor2 = Color.FromArgb(73, 119, 232);
    
            [Description("副标题文本色"), Category("自定义")]
            public Color ItemForeColor2
            {
                get { return _itemForeColor2; }
                set { _itemForeColor2 = value; }
            }
            private Color _itemSelectedForeColor2 = Color.White;
    
            [Description("副标题选中文本色"), Category("自定义")]
            public Color ItemSelectedForeColor2
            {
                get { return _itemSelectedForeColor2; }
                set { _itemSelectedForeColor2 = value; }
            }
    
            private int _itemHeight = 60;
    
            [Description("项高度"), Category("自定义")]
            public int ItemHeight
            {
                get { return _itemHeight; }
                set { _itemHeight = value; }
            }
    
            private bool _autoSelectFirst = true;
            [Description("自动选中第一项"), Category("自定义")]
            public bool AutoSelectFirst
            {
                get { return _autoSelectFirst; }
                set { _autoSelectFirst = value; }
            }
            public delegate void ItemClickEvent(UCListItemExt item);
            [Description("选中项事件"), Category("自定义")]
            public event ItemClickEvent ItemClick;
    
            private bool _selectedCanClick = false;
            [Description("选中后是否可以再次触发点击事件"), Category("自定义")]
            public bool SelectedCanClick
            {
                get { return _selectedCanClick; }
                set { _selectedCanClick = value; }
            }
    
            /// <summary>
            /// 选中的节点
            /// </summary>
            public UCListItemExt SelectItem
            {
                get { return _current; }
            }

    向外暴露一个设置数据源的函数

    public void SetList(List<ListEntity> lst)
            {
                try
                {
                    ControlHelper.FreezeControl(this, true);
                    this.Controls.Clear();
                    this.SuspendLayout();
                    UCListItemExt _first = null;
                    for (int i = lst.Count - 1; i >= 0; i--)
                    {
                        var item = lst[i];
                        UCListItemExt li = new UCListItemExt();
                        li.Height = _itemHeight;
                        li.TitleFont = _titleFont;
                        li.Title2Font = _title2Font;
                        li.ItemBackColor = _itemBackColor;
                        li.ItemForeColor = _itemForeColor;
                        li.ItemForeColor2 = _itemForeColor2;
                        li.Dock = DockStyle.Top;
                        li.SetData(item);
                        li.ItemClick += (s, e) => { SelectLabel((UCListItemExt)s); };
                        this.Controls.Add(li);
                        _first = li;
                    }
                    if (_autoSelectFirst)
                        SelectLabel(_first);
                    this.ResumeLayout(false);
    
                    Timer timer = new Timer();
                    timer.Interval = 10;
                    timer.Tick += (a, b) =>
                    {
                        timer.Enabled = false;
                        this.VerticalScroll.Value = 1;
                        this.VerticalScroll.Value = 0;
                        this.Refresh();
                    };
                    timer.Enabled = true;
                }
                finally
                {
                    ControlHelper.FreezeControl(this, false);
                }
            }

    选中项的处理

    private void SelectLabel(UCListItemExt li)
            {
                try
                {
                    HZH_Controls.ControlHelper.FreezeControl(this, true);
                    this.FindForm().ActiveControl = this;
                    if (_current != null)
                    {
                        if (_current == li && !_selectedCanClick)
                            return;
                        _current.ItemBackColor = _itemBackColor;
                        _current.ItemForeColor = _itemForeColor;
                        _current.ItemForeColor2 = _itemForeColor2;
                    }
                    li.ItemBackColor = _itemSelectedBackColor;
                    li.ItemForeColor = _itemSelectedForeColor;
                    li.ItemForeColor2 = _itemSelectedForeColor2;
    
                    _current = li;
                    if (ItemClick != null)
                    {
                        ItemClick(li);
                    }
                }
                finally
                {
                    HZH_Controls.ControlHelper.FreezeControl(this, false);
                }
            }

    完成,看下完整代码

    // 版权所有  黄正辉  交流群:568015492   QQ:623128629
    // 文件名称:UCListExt.cs
    // 创建日期:2019-08-15 16:01:22
    // 功能描述:List
    // 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace HZH_Controls.Controls
    {
        [DefaultEvent("ItemClick")]
        public partial class UCListExt : UserControl
        {
            private Font _titleFont = new Font("微软雅黑", 15F);
            [Description("标题字体"), Category("自定义")]
            public Font TitleFont
            {
                get { return _titleFont; }
                set { _titleFont = value; }
            }
            private Font _title2Font = new Font("微软雅黑", 14F);
            [Description("副标题字体"), Category("自定义")]
            public Font Title2Font
            {
                get { return _title2Font; }
                set { _title2Font = value; }
            }
    
            private Color _itemBackColor = Color.White;
            [Description("标题背景色"), Category("自定义")]
            public Color ItemBackColor
            {
                get { return _itemBackColor; }
                set { _itemBackColor = value; }
            }
    
            private Color _itemSelectedBackColor = Color.FromArgb(73, 119, 232);
    
            [Description("标题选中背景色"), Category("自定义")]
            public Color ItemSelectedBackColor
            {
                get { return _itemSelectedBackColor; }
                set { _itemSelectedBackColor = value; }
            }
    
            private Color _itemForeColor = Color.Black;
    
            [Description("标题文本色"), Category("自定义")]
            public Color ItemForeColor
            {
                get { return _itemForeColor; }
                set { _itemForeColor = value; }
            }
            private Color _itemSelectedForeColor = Color.White;
    
            [Description("标题选中文本色"), Category("自定义")]
            public Color ItemSelectedForeColor
            {
                get { return _itemSelectedForeColor; }
                set { _itemSelectedForeColor = value; }
            }
            private Color _itemForeColor2 = Color.FromArgb(73, 119, 232);
    
            [Description("副标题文本色"), Category("自定义")]
            public Color ItemForeColor2
            {
                get { return _itemForeColor2; }
                set { _itemForeColor2 = value; }
            }
            private Color _itemSelectedForeColor2 = Color.White;
    
            [Description("副标题选中文本色"), Category("自定义")]
            public Color ItemSelectedForeColor2
            {
                get { return _itemSelectedForeColor2; }
                set { _itemSelectedForeColor2 = value; }
            }
    
            private int _itemHeight = 60;
    
            [Description("项高度"), Category("自定义")]
            public int ItemHeight
            {
                get { return _itemHeight; }
                set { _itemHeight = value; }
            }
    
            private bool _autoSelectFirst = true;
            [Description("自动选中第一项"), Category("自定义")]
            public bool AutoSelectFirst
            {
                get { return _autoSelectFirst; }
                set { _autoSelectFirst = value; }
            }
            public delegate void ItemClickEvent(UCListItemExt item);
            [Description("选中项事件"), Category("自定义")]
            public event ItemClickEvent ItemClick;
    
            private bool _selectedCanClick = false;
            [Description("选中后是否可以再次触发点击事件"), Category("自定义")]
            public bool SelectedCanClick
            {
                get { return _selectedCanClick; }
                set { _selectedCanClick = value; }
            }
    
            /// <summary>
            /// 选中的节点
            /// </summary>
            public UCListItemExt SelectItem
            {
                get { return _current; }
            }
            UCListItemExt _current = null;
            public UCListExt()
            {
                InitializeComponent();
                SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
                this.UpdateStyles();
            }
    
            public void SetList(List<ListEntity> lst)
            {
                try
                {
                    ControlHelper.FreezeControl(this, true);
                    this.Controls.Clear();
                    this.SuspendLayout();
                    UCListItemExt _first = null;
                    for (int i = lst.Count - 1; i >= 0; i--)
                    {
                        var item = lst[i];
                        UCListItemExt li = new UCListItemExt();
                        li.Height = _itemHeight;
                        li.TitleFont = _titleFont;
                        li.Title2Font = _title2Font;
                        li.ItemBackColor = _itemBackColor;
                        li.ItemForeColor = _itemForeColor;
                        li.ItemForeColor2 = _itemForeColor2;
                        li.Dock = DockStyle.Top;
                        li.SetData(item);
                        li.ItemClick += (s, e) => { SelectLabel((UCListItemExt)s); };
                        this.Controls.Add(li);
                        _first = li;
                    }
                    if (_autoSelectFirst)
                        SelectLabel(_first);
                    this.ResumeLayout(false);
    
                    Timer timer = new Timer();
                    timer.Interval = 10;
                    timer.Tick += (a, b) =>
                    {
                        timer.Enabled = false;
                        this.VerticalScroll.Value = 1;
                        this.VerticalScroll.Value = 0;
                        this.Refresh();
                    };
                    timer.Enabled = true;
                }
                finally
                {
                    ControlHelper.FreezeControl(this, false);
                }
            }
    
            private void SelectLabel(UCListItemExt li)
            {
                try
                {
                    HZH_Controls.ControlHelper.FreezeControl(this, true);
                    this.FindForm().ActiveControl = this;
                    if (_current != null)
                    {
                        if (_current == li && !_selectedCanClick)
                            return;
                        _current.ItemBackColor = _itemBackColor;
                        _current.ItemForeColor = _itemForeColor;
                        _current.ItemForeColor2 = _itemForeColor2;
                    }
                    li.ItemBackColor = _itemSelectedBackColor;
                    li.ItemForeColor = _itemSelectedForeColor;
                    li.ItemForeColor2 = _itemSelectedForeColor2;
    
                    _current = li;
                    if (ItemClick != null)
                    {
                        ItemClick(li);
                    }
                }
                finally
                {
                    HZH_Controls.ControlHelper.FreezeControl(this, false);
                }
            }
    
        }
    
    }
    namespace HZH_Controls.Controls
    {
        partial class UCListExt
        {
            /// <summary> 
            /// 必需的设计器变量。
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary> 
            /// 清理所有正在使用的资源。
            /// </summary>
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region 组件设计器生成的代码
    
            /// <summary> 
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                this.SuspendLayout();
                // 
                // ListExt
                // 
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
                this.AutoScroll = true;
                this.Name = "ListExt";
                this.Size = new System.Drawing.Size(336, 368);
                this.ResumeLayout(false);
    
            }
    
            #endregion
        }
    }

    用处及效果

    调用示例

    List<ListEntity> lst = new List<ListEntity>();
                for (int i = 0; i < 5; i++)
                {
                    lst.Add(new ListEntity()
                    {
                        ID = i.ToString(),
                        Title = "选项" + i,
                        ShowMoreBtn = true,
                        Source = i
                    });
                }
                this.ucListExt1.SetList(lst);

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星 星吧

    展开全文
  • 这个控件C#2.0在VS 2005上实现的。现在,我不能保证这个实现没有bug,但至少它是免费的,并且它有源代码。因而,您可以根据您的需要修改它们,以适合于您自己的用途。无论如何要注意:这个控件并没有完成!一些...
  • C#自定义控件实现窗体绘制表格

    万次阅读 2017-07-28 13:54:21
    C#自定义控件

    一、自定义窗体控件

          新建项目 如图


    二、绘制表格

                                                                               


    三、绘制表格的代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsControlLibrary1
    {
        public partial class UserControl1: UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
            private void Form_Paint(object sender, PaintEventArgs e)
            {
                //绘制表格
                Graphics g = this.CreateGraphics();
                Pen pen0 = new Pen(Color.White,3);  //设置画笔颜色和Pen_Size =3
                //横向
                for (int x = 0; x <= 896; )
                {
                    g.DrawLine(pen0, x, 0, x, 768);
                    x += 16;
                }
                //纵向
                for (int y = 0; y <= 768; )
                {
                    g.DrawLine(pen0, 0, y, 896, y);
                    y += 16;
                }
            }
        }
    }


    控件效果图如下


    四、使用该自定义控件

         1、新建一个winform项目

         2、双击工具箱 如图 选择“选择项”

                                                                                                    

        3、添加自定义控件到工具箱,点击确定(我已经添加过了)

                                          


        4、使用控件 筛选找到添加的控件

                                                                                       

     

       5、 拖动到窗体上 ok 点击运行

         


       完成


    可能有旁友会问,为什么不直接在窗体上绘制,反而多此一举搞个自定义控件呢?

    这个问题我也不知道怎么回答,我在做某个项目的时候确实是直接在窗体绘制的,当时窗体上还有一些按钮。我做的项目是需要根据数据在表格上填充颜色的,但是不知道为什么鼠标只要经过按钮等其他控件,整个表格里的数据全都变了。后来自定义控件之后才解决这个问题。

    刚接触C#不久,不知道其中道理,还望大牛指点。谢谢~




    展开全文
  • C# 自定义属性在propertyGrid控件中显示 演示demo
  • 自定义 Windows 窗体 DataGridView 控件 现有的几种嵌套控件,但无时间控件类型,下载代码中就是嵌套了时间控件类。 System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms.DataGridView...
  • c#自定义控件属性

    千次阅读 2017-11-12 00:05:41
    _ali 随笔 - 67, 文章 - 0, 评论 - 2, 引用 - 0 C#中的自定义控件中的属性、事件及一些...今天学习了下C#用户控件开发添加自定义属性的事件,主要参考了MSDN,总结并实验了一些用于开发自定义属性和事件的特性
  • 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果...
  • 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果...
  • 一个基于.NET C# 开发的 Winform 自定义表单设计组件。支持Xml保存和加载表单,支持控件的拖放和属设置,支持复制、粘贴、对齐、撤销、重做等设计时操作。
  • 出处:http://www.hzhcontrols.com/原文:http://www.hzhcontrols.com/blog-149.html本文版权归...入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com...
  • c#自定义控件做漂亮的列表

    千次阅读 2015-05-29 12:19:00
    效果图如下: 完整项目代码下载: 点击下载 转载于:https://www.cnblogs.com/tuzhiyuan/p/4538196.html
  • 最近在项目开发中遇到一个小...我们希望根据设备类型能够自主添加/修改/删除属性,另一方面其他模块也会用到此功能,所以考虑做一个自定义控件,将增、删、改操作封装在控件内部,数据对外开放。 环境 版本 操作系统
  • C#自定义控件-事件-委托

    千次阅读 2013-12-02 23:01:17
    在组件编程中对事件的理解是十分重要的,C# 中的“事件”是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。... 首先创建一个Windows控件项目,添加如下控件样板:  当事件触发时,
  • 推荐一个C# GDI+ 自定义控件

    千次阅读 2017-10-09 15:10:23
    其实这方面github上挺多的分享源码,这里看到一个还不错的:https://github.com/Unknwon/CharmControlLibrary
  • 第三步,创建Execl表格 //创建Excel Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); Workbook execlWB = excelApp.Workbooks.Add(System.Type.Missing...
  • 非常值得收藏,下载的源码资源: 1. 代码源自网络,并添加部分示例代码; 2. 自定义Combobx下拉框,支持基础控件下拉,也支持自定义控件下拉,扩展十分方便;
  • winform自定义panel控件

    千次阅读 2014-07-16 16:11:23
    有很多时候,开发winform,系统给的控件往往不能满足需求,所以,
  • 表格的列里添加其他的样式,可以自定义列改变表格里的样式。比如在表格的列里插入复选框,就是在手术对应的列下插入复选框。 1、如果把复选框{type:‘checkbox’}写到手术那,那么手术那一列在页面显示出来的效果...
  • 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果...
  • C#中的自定义控件中的属性(Property)、事件(Event)及一些相关特性(Attribute)的总结
  • 表格 绑定数据 界面放个panel就够了。 上代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System....
  • c#中实现DataGridView中自定义控件

    千次阅读 2013-09-19 10:06:10
    写到这里的时候,我忽然修改了下文章标题,将问题更加简单化和明确化为一种效果的实现:在c#中实现DataGridView中自定义控件列。能否实现这样的效果的话,基本上问题也就讲清楚了。上面的一大段可以忽略了。 ...
  • C# Winform使用ListVIew控件制作表格

    万次阅读 2018-12-12 15:13:19
    1、找到ListVIew拖到窗体中 2、点击右上角,设置视图为 Details,或者直接在属性里面设置View为Details 3、添加列表头:点击属性Columns 完后效果如下: 4、添加行表头:点击...System.ArgumentOutOf...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,784
精华内容 2,713
关键字:

c#自定义表格控件

c# 订阅