苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 23504|回复: 5

[C#皮肤] C#皮肤-ComboBoxDataGridView

[复制链接]
发表于 2013-3-7 11:20:17 | 显示全部楼层 |阅读模式
    C#皮肤-ComboBoxDataGridView

导读部分
-------------------------------------------------------------------------------------------------------------
C#皮肤-实现原理系列文章导航
http://www.sufeinet.com/thread-2-1-1.html

大家还是先来看看效果吧

comboxdatagirdview1.png          comboxdatagirdview3.jpg

我个人认为这个控件是皮肤控件走向高端的第一步,很多人说让我把控件做的像什么,什么第三方的那种,其实最开始的是为了让大家知道怎么样使用C#单纯的Gdi+来实现,不过现在我感觉是时候改改了,
今天就以这个控件开始吧,接下来的皮肤会更高端一些,希望大家期待并支持,如果你感觉不错的话可以订阅哦
订阅网址:http://list.qq.com/cgi-bin/qf_invite?id=084ffdd8383d8ced5040839a4dfbcb1cf5511d43c9c31beb

下面我们一起来看看是怎么样实现 的


这个其实是控件里是没有的,那天在博客上看到一个同志在写这个控件,所性抄一点思想,在结合我和控件就加上了,还挺好用的,呵呵,有了这个控件大家就不用再为绑定一个表那个字段面苦了,可以一下自全部绑定,实现很简单大家一起来看看吧
        第一步我们新建一个组件名称 为ComboBoxDataGridView
其实就是dataGridViewHost  和ToolStripDropDown之间的相互配合
这个控件是继承自我皮肤里的控件Combox这个大家一会儿看代码
我们要声明一个委托来调用 构造DataGridViw的方法
  1. //声明一个委托
  2.         public delegate void ComboBoxDataGridViewScroll(object sender, bool vscroll);
  3.         public event ComboBoxDataGridViewScroll OnScroll;
  4.         private const int WM_HSCROLL = 0x114;
  5.         private const int WM_VSCROLL = 0x115;

  6.         public ComboBoxDataGridView()
  7.         {
  8.             this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
  9.             DrawDataGridView();
  10.             this.OnScroll += new ComboBoxDataGridViewScroll(ComboBoxDataGridView_OnScroll);
  11.         }
复制代码

我们先来看看 DrawDataGridView();
方法吧
  1. private void DrawDataGridView()
  2.         {
  3.             CRD.WinUI.Editors.DataGridView dataGridView = new CRD.WinUI.Editors.DataGridView();
  4.             dataGridView.RowHeadersVisible = false;
  5.             dataGridView.RowTemplate.Resizable = DataGridViewTriState.False; //固定行高不允许调节
  6.             dataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  7.             dataGridView.BackgroundColor = SystemColors.ActiveCaptionText;
  8.             dataGridView.BorderStyle = BorderStyle.None;
  9.             dataGridView.ReadOnly = true;
  10.             dataGridView.AllowUserToAddRows = false;
  11.             dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  12.             dataGridView.Click += new EventHandler(dataGridView_Click);

  13.             //设置DataGridView的数据源
  14.             CRD.WinUI.Forms.EntryForm frmDataSource = new CRD.WinUI.Forms.EntryForm();
  15.             frmDataSource.Controls.Add(dataGridView);
  16.             frmDataSource.SuspendLayout();

  17.             dataGridViewHost = new ToolStripControlHost(dataGridView);
  18.             dataGridViewHost.AutoSize = m_blPopupAutoSize;

  19.             dropDown = new ToolStripDropDown();
  20.             dropDown.Width = this.Width;
  21.             dropDown.Items.Add(dataGridViewHost);
  22.         }
复制代码

有关DatagridView和Combox的实现 代码大家请参考我的皮肤系统,呵呵
下面我把代码都放上来各们看看吧也提提建议
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Diagnostics;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using System.Drawing;

  8. namespace CRD.WinUI.Misc
  9. {
  10.     public partial class ComboBoxDataGridView : CRD.WinUI.Misc.ComboBox
  11.     {
  12.         // 成员变量
  13.         private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203;
  14.         ToolStripControlHost dataGridViewHost;
  15.         ToolStripDropDown dropDown;
  16.         private string m_sDefaultColumn;
  17.         private bool m_blPopupAutoSize = false;
  18.         private DataGridViewRow m_dgvRow;
  19.         public event EventHandler AfterSelector;
  20.         /**/
  21.         ////声明一个委托
  22.         public delegate void ComboBoxDataGridViewScroll(object sender, bool vscroll);
  23.         public event ComboBoxDataGridViewScroll OnScroll;
  24.         private const int WM_HSCROLL = 0x114;
  25.         private const int WM_VSCROLL = 0x115;



  26.         public ComboBoxDataGridView()
  27.         {
  28.             this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
  29.             DrawDataGridView();
  30.             this.OnScroll += new ComboBoxDataGridViewScroll(ComboBoxDataGridView_OnScroll);
  31.         }

  32.         public void ComboBoxDataGridView_OnScroll(object sender, bool vscroll)
  33.         {
  34.             this.dataGridViewHost.Focus();
  35.         }


  36.         [Description("设置DataGridView属性"), Browsable(true), Category("N8")]
  37.         public DataGridView DataGridView
  38.         {
  39.             get
  40.             {
  41.                 return dataGridViewHost.Control as DataGridView;
  42.             }
  43.         }
  44.         [Description("下拉表格尺寸是否为自动"), Browsable(true), Category("N8")]
  45.         public bool PopupGridAutoSize
  46.         {
  47.             set
  48.             {
  49.                 m_blPopupAutoSize = value;
  50.             }
  51.         }

  52.         [Description("设置默认值"), Browsable(true), Category("N8")]
  53.         public string DefaultColumn
  54.         {
  55.             set
  56.             {
  57.                 m_sDefaultColumn = value;
  58.             }
  59.             get
  60.             {
  61.                 if (m_sDefaultColumn == null)
  62.                 {
  63.                     return String.Empty;
  64.                 }
  65.                 else
  66.                 {
  67.                     return m_sDefaultColumn;
  68.                 }
  69.             }
  70.         }

  71.         //绘制DataGridView以及下拉DataGridView
  72.         private void DrawDataGridView()
  73.         {
  74.             CRD.WinUI.Editors.DataGridView dataGridView = new CRD.WinUI.Editors.DataGridView();
  75.             dataGridView.RowHeadersVisible = false;
  76.             dataGridView.RowTemplate.Resizable = DataGridViewTriState.False; //固定行高不允许调节
  77.             dataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  78.             dataGridView.BackgroundColor = SystemColors.ActiveCaptionText;
  79.             dataGridView.BorderStyle = BorderStyle.None;
  80.             dataGridView.ReadOnly = true;
  81.             dataGridView.AllowUserToAddRows = false;
  82.             dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  83.             dataGridView.Click += new EventHandler(dataGridView_Click);

  84.             //设置DataGridView的数据源
  85.             CRD.WinUI.Forms.EntryForm frmDataSource = new CRD.WinUI.Forms.EntryForm();
  86.             frmDataSource.Controls.Add(dataGridView);
  87.             frmDataSource.SuspendLayout();

  88.             dataGridViewHost = new ToolStripControlHost(dataGridView);
  89.             dataGridViewHost.AutoSize = m_blPopupAutoSize;

  90.             dropDown = new ToolStripDropDown();
  91.             dropDown.Width = this.Width;
  92.             dropDown.Items.Add(dataGridViewHost);
  93.         }

  94.         public void dataGridView_Click(object sender, EventArgs e)
  95.         {
  96.             PopupGridView(e);
  97.         }

  98.         public string GetDataProperty(string sColumn) //
  99.         {
  100.             string sValue = "";
  101.             if (m_dgvRow != null)
  102.             {
  103.                 if (DataGridView.Columns.Contains(sColumn))
  104.                 {
  105.                     sValue = m_dgvRow.Cells[sColumn].Value.ToString();
  106.                 }
  107.             }
  108.             return sValue;
  109.         }
  110.         public void dataGridView_DoubleClick(object sender, EventArgs e)
  111.         {
  112.             PopupGridView(e);
  113.         }

  114.         // PopupGridView


  115.         /**/
  116.         /// <summary>
  117.         /// 弹出下拉表格并触发选择后事件
  118.         /// </summary>
  119.         /// <param name="e"></param>
  120.         private void PopupGridView(EventArgs e)
  121.         {
  122.             if (DataGridView.SelectedRows.Count > 0)
  123.             {
  124.                 m_dgvRow = DataGridView.SelectedRows[0];
  125.                 if (m_sDefaultColumn != String.Empty)
  126.                 {
  127.                     string[] sColumnList = m_sDefaultColumn.Split(',');
  128.                     foreach (string sColumn in sColumnList)
  129.                     {
  130.                         if (DataGridView.Columns.Contains(sColumn))
  131.                         {
  132.                             Items.Clear();
  133.                             Items.Add(m_dgvRow.Cells[sColumn].Value.ToString());
  134.                             SelectedIndex = 0;
  135.                         }
  136.                     }
  137.                 }

  138.                 if (AfterSelector != null)
  139.                 {
  140.                     AfterSelector(this, e);
  141.                 }
  142.             }
  143.             dropDown.Close();
  144.         }



  145.         private void ShowDropDown()
  146.         {

  147.             if (dropDown != null)
  148.             {
  149.                 dataGridViewHost.Size = new Size(DropDownWidth - 2, DropDownHeight);
  150.                 dropDown.Show(this, 0, this.Height);
  151.             }
  152.         }

  153.         //重写方法


  154.         protected override void WndProc(ref Message m)
  155.         {
  156.             if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN || m.Msg == 0x114 || m.Msg == 0x115)
  157.             {
  158.                 ShowDropDown();
  159.                 if (OnScroll != null)
  160.                 {
  161.                     OnScroll(this, m.Msg == 0x115);
  162.                 }
  163.                 return;
  164.             }
  165.             base.WndProc(ref m);

  166.         }

  167.         protected override void Dispose(bool disposing)
  168.         {
  169.             if (disposing)
  170.             {
  171.                 if (dropDown != null)
  172.                 {
  173.                     dropDown.Dispose();
  174.                     dropDown = null;
  175.                 }
  176.             }
  177.             base.Dispose(disposing);
  178.         }
  179.     }
  180. }
复制代码

本帖被以下淘专辑推荐:

  • · 皮肤|主题: 15, 订阅: 0


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-4-16 18:15:04 | 显示全部楼层
新来,前来多学学。
发表于 2013-11-3 20:06:40 | 显示全部楼层
哥你真牛逼
发表于 2014-9-26 10:49:40 | 显示全部楼层
请教下,重新设置DataGridView的DataSource后,gird显示的数据不刷新。有什么办法能解决吗?
 楼主| 发表于 2014-9-26 10:53:44 | 显示全部楼层
gunu40 发表于 2014-9-26 10:49
请教下,重新设置DataGridView的DataSource后,gird显示的数据不刷新。有什么办法能解决吗?

应该是代码那里写的有问题吧,我使用时候没见过这种情况,可以发下贴,贴下相关代码看看
发表于 2014-9-26 12:28:10 | 显示全部楼层
看起来问题出在Gird是放在一个临时Form上的问题,改了DataSource要重新调用DrawDataGridView才行。不然Grid不会刷新显示的数据。

//设置DataGridView的数据源
            CRD.WinUI.Forms.EntryForm frmDataSource = new CRD.WinUI.Forms.EntryForm();
            frmDataSource.Controls.Add(dataGridView);
            frmDataSource.SuspendLayout();

这段代码很多人都在疑问。DataSource里的内容变化,Grid会更新。但是DataSource本身变了,Grid就不会更新了。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-27 05:35

© 2014-2021

快速回复 返回顶部 返回列表