C#仿QQ皮肤-ComboBoxDataGridView
C#仿QQ皮肤-实现原理系列文章导航
http://www.cnblogs.com/sufei/archive/2010/03/10/1682847.html
大家还是先来看看效果吧
下面我们一起来看看是怎么样实现的
这个其实是控件里是没有的,那天在博客上看到一个同志在写这个控件,所性抄一点思想,在结合我和控件就加上了,还挺好用的,呵呵,有了这个控件大家就不用再为绑定一个表那个字段面苦了,可以一下自全部绑定,实现很简单大家一起来看看吧
第一步我们新建一个组件名称 为ComboBoxDataGridView
其实就是dataGridViewHost 和ToolStripDropDown之间的相互配合
这个控件是继承自我皮肤里的控件Combox这个大家一会儿看代码
我们要声明一个委托来调用 构造DataGridViw的方法
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->////声明一个委托
publicdelegatevoidComboBoxDataGridViewScroll(objectsender,boolvscroll);
publiceventComboBoxDataGridViewScrollOnScroll;
privateconstintWM_HSCROLL=0x114;
privateconstintWM_VSCROLL=0x115;
publicComboBoxDataGridView()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
DrawDataGridView();
this.OnScroll+=newComboBoxDataGridViewScroll(ComboBoxDataGridView_OnScroll);
}
publicdelegatevoidComboBoxDataGridViewScroll(objectsender,boolvscroll);
publiceventComboBoxDataGridViewScrollOnScroll;
privateconstintWM_HSCROLL=0x114;
privateconstintWM_VSCROLL=0x115;
publicComboBoxDataGridView()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
DrawDataGridView();
this.OnScroll+=newComboBoxDataGridViewScroll(ComboBoxDataGridView_OnScroll);
}
我们先来看看DrawDataGridView();
方法吧
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privatevoidDrawDataGridView()
{
CRD.WinUI.Editors.DataGridViewdataGridView=newCRD.WinUI.Editors.DataGridView();
dataGridView.RowHeadersVisible=false;
dataGridView.RowTemplate.Resizable=DataGridViewTriState.False;//固定行高不允许调节
dataGridView.ColumnHeadersDefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;
dataGridView.BackgroundColor=SystemColors.ActiveCaptionText;
dataGridView.BorderStyle=BorderStyle.None;
dataGridView.ReadOnly=true;
dataGridView.AllowUserToAddRows=false;
dataGridView.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
dataGridView.Click+=newEventHandler(dataGridView_Click);
//设置DataGridView的数据源
CRD.WinUI.Forms.EntryFormfrmDataSource=newCRD.WinUI.Forms.EntryForm();
frmDataSource.Controls.Add(dataGridView);
frmDataSource.SuspendLayout();
dataGridViewHost=newToolStripControlHost(dataGridView);
dataGridViewHost.AutoSize=m_blPopupAutoSize;
dropDown=newToolStripDropDown();
dropDown.Width=this.Width;
dropDown.Items.Add(dataGridViewHost);
}
{
CRD.WinUI.Editors.DataGridViewdataGridView=newCRD.WinUI.Editors.DataGridView();
dataGridView.RowHeadersVisible=false;
dataGridView.RowTemplate.Resizable=DataGridViewTriState.False;//固定行高不允许调节
dataGridView.ColumnHeadersDefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;
dataGridView.BackgroundColor=SystemColors.ActiveCaptionText;
dataGridView.BorderStyle=BorderStyle.None;
dataGridView.ReadOnly=true;
dataGridView.AllowUserToAddRows=false;
dataGridView.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
dataGridView.Click+=newEventHandler(dataGridView_Click);
//设置DataGridView的数据源
CRD.WinUI.Forms.EntryFormfrmDataSource=newCRD.WinUI.Forms.EntryForm();
frmDataSource.Controls.Add(dataGridView);
frmDataSource.SuspendLayout();
dataGridViewHost=newToolStripControlHost(dataGridView);
dataGridViewHost.AutoSize=m_blPopupAutoSize;
dropDown=newToolStripDropDown();
dropDown.Width=this.Width;
dropDown.Items.Add(dataGridViewHost);
}
有关DatagridView和Combox的实现 代码大家请参考我的皮肤系统,呵呵
下面我把代码都放上来各们看看吧也提提建议
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Diagnostics;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Drawing;
namespaceCRD.WinUI.Misc
{
publicpartialclassComboBoxDataGridView:CRD.WinUI.Misc.ComboBox
{
//成员变量
privateconstintWM_LBUTTONDOWN=0x201,WM_LBUTTONDBLCLK=0x203;
ToolStripControlHostdataGridViewHost;
ToolStripDropDowndropDown;
privatestringm_sDefaultColumn;
privateboolm_blPopupAutoSize=false;
privateDataGridViewRowm_dgvRow;
publiceventEventHandlerAfterSelector;
/**/
////声明一个委托
publicdelegatevoidComboBoxDataGridViewScroll(objectsender,boolvscroll);
publiceventComboBoxDataGridViewScrollOnScroll;
privateconstintWM_HSCROLL=0x114;
privateconstintWM_VSCROLL=0x115;
publicComboBoxDataGridView()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
DrawDataGridView();
this.OnScroll+=newComboBoxDataGridViewScroll(ComboBoxDataGridView_OnScroll);
}
publicvoidComboBoxDataGridView_OnScroll(objectsender,boolvscroll)
{
this.dataGridViewHost.Focus();
}
[Description("设置DataGridView属性"),Browsable(true),Category("N8")]
publicDataGridViewDataGridView
{
get
{
returndataGridViewHost.ControlasDataGridView;
}
}
[Description("下拉表格尺寸是否为自动"),Browsable(true),Category("N8")]
publicboolPopupGridAutoSize
{
set
{
m_blPopupAutoSize=value;
}
}
[Description("设置默认值"),Browsable(true),Category("N8")]
publicstringDefaultColumn
{
set
{
m_sDefaultColumn=value;
}
get
{
if(m_sDefaultColumn==null)
{
returnString.Empty;
}
else
{
returnm_sDefaultColumn;
}
}
}
//绘制DataGridView以及下拉DataGridView
privatevoidDrawDataGridView()
{
CRD.WinUI.Editors.DataGridViewdataGridView=newCRD.WinUI.Editors.DataGridView();
dataGridView.RowHeadersVisible=false;
dataGridView.RowTemplate.Resizable=DataGridViewTriState.False;//固定行高不允许调节
dataGridView.ColumnHeadersDefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;
dataGridView.BackgroundColor=SystemColors.ActiveCaptionText;
dataGridView.BorderStyle=BorderStyle.None;
dataGridView.ReadOnly=true;
dataGridView.AllowUserToAddRows=false;
dataGridView.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
dataGridView.Click+=newEventHandler(dataGridView_Click);
//设置DataGridView的数据源
CRD.WinUI.Forms.EntryFormfrmDataSource=newCRD.WinUI.Forms.EntryForm();
frmDataSource.Controls.Add(dataGridView);
frmDataSource.SuspendLayout();
dataGridViewHost=newToolStripControlHost(dataGridView);
dataGridViewHost.AutoSize=m_blPopupAutoSize;
dropDown=newToolStripDropDown();
dropDown.Width=this.Width;
dropDown.Items.Add(dataGridViewHost);
}
publicvoiddataGridView_Click(objectsender,EventArgse)
{
PopupGridView(e);
}
publicstringGetDataProperty(stringsColumn)//
{
stringsValue="";
if(m_dgvRow!=null)
{
if(DataGridView.Columns.Contains(sColumn))
{
sValue=m_dgvRow.Cells[sColumn].Value.ToString();
}
}
returnsValue;
}
publicvoiddataGridView_DoubleClick(objectsender,EventArgse)
{
PopupGridView(e);
}
//PopupGridView
/**/
///<summary>
///弹出下拉表格并触发选择后事件
///</summary>
///<paramname="e"></param>
privatevoidPopupGridView(EventArgse)
{
if(DataGridView.SelectedRows.Count>0)
{
m_dgvRow=DataGridView.SelectedRows[0];
if(m_sDefaultColumn!=String.Empty)
{
string[]sColumnList=m_sDefaultColumn.Split(',');
foreach(stringsColumninsColumnList)
{
if(DataGridView.Columns.Contains(sColumn))
{
Items.Clear();
Items.Add(m_dgvRow.Cells[sColumn].Value.ToString());
SelectedIndex=0;
}
}
}
if(AfterSelector!=null)
{
AfterSelector(this,e);
}
}
dropDown.Close();
}
privatevoidShowDropDown()
{
if(dropDown!=null)
{
dataGridViewHost.Size=newSize(DropDownWidth-2,DropDownHeight);
dropDown.Show(this,0,this.Height);
}
}
//重写方法
protectedoverridevoidWndProc(refMessagem)
{
if(m.Msg==WM_LBUTTONDBLCLK||m.Msg==WM_LBUTTONDOWN||m.Msg==0x114||m.Msg==0x115)
{
ShowDropDown();
if(OnScroll!=null)
{
OnScroll(this,m.Msg==0x115);
}
return;
}
base.WndProc(refm);
}
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
if(dropDown!=null)
{
dropDown.Dispose();
dropDown=null;
}
}
base.Dispose(disposing);
}
}
}
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Diagnostics;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Drawing;
namespaceCRD.WinUI.Misc
{
publicpartialclassComboBoxDataGridView:CRD.WinUI.Misc.ComboBox
{
//成员变量
privateconstintWM_LBUTTONDOWN=0x201,WM_LBUTTONDBLCLK=0x203;
ToolStripControlHostdataGridViewHost;
ToolStripDropDowndropDown;
privatestringm_sDefaultColumn;
privateboolm_blPopupAutoSize=false;
privateDataGridViewRowm_dgvRow;
publiceventEventHandlerAfterSelector;
/**/
////声明一个委托
publicdelegatevoidComboBoxDataGridViewScroll(objectsender,boolvscroll);
publiceventComboBoxDataGridViewScrollOnScroll;
privateconstintWM_HSCROLL=0x114;
privateconstintWM_VSCROLL=0x115;
publicComboBoxDataGridView()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
DrawDataGridView();
this.OnScroll+=newComboBoxDataGridViewScroll(ComboBoxDataGridView_OnScroll);
}
publicvoidComboBoxDataGridView_OnScroll(objectsender,boolvscroll)
{
this.dataGridViewHost.Focus();
}
[Description("设置DataGridView属性"),Browsable(true),Category("N8")]
publicDataGridViewDataGridView
{
get
{
returndataGridViewHost.ControlasDataGridView;
}
}
[Description("下拉表格尺寸是否为自动"),Browsable(true),Category("N8")]
publicboolPopupGridAutoSize
{
set
{
m_blPopupAutoSize=value;
}
}
[Description("设置默认值"),Browsable(true),Category("N8")]
publicstringDefaultColumn
{
set
{
m_sDefaultColumn=value;
}
get
{
if(m_sDefaultColumn==null)
{
returnString.Empty;
}
else
{
returnm_sDefaultColumn;
}
}
}
//绘制DataGridView以及下拉DataGridView
privatevoidDrawDataGridView()
{
CRD.WinUI.Editors.DataGridViewdataGridView=newCRD.WinUI.Editors.DataGridView();
dataGridView.RowHeadersVisible=false;
dataGridView.RowTemplate.Resizable=DataGridViewTriState.False;//固定行高不允许调节
dataGridView.ColumnHeadersDefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;
dataGridView.BackgroundColor=SystemColors.ActiveCaptionText;
dataGridView.BorderStyle=BorderStyle.None;
dataGridView.ReadOnly=true;
dataGridView.AllowUserToAddRows=false;
dataGridView.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
dataGridView.Click+=newEventHandler(dataGridView_Click);
//设置DataGridView的数据源
CRD.WinUI.Forms.EntryFormfrmDataSource=newCRD.WinUI.Forms.EntryForm();
frmDataSource.Controls.Add(dataGridView);
frmDataSource.SuspendLayout();
dataGridViewHost=newToolStripControlHost(dataGridView);
dataGridViewHost.AutoSize=m_blPopupAutoSize;
dropDown=newToolStripDropDown();
dropDown.Width=this.Width;
dropDown.Items.Add(dataGridViewHost);
}
publicvoiddataGridView_Click(objectsender,EventArgse)
{
PopupGridView(e);
}
publicstringGetDataProperty(stringsColumn)//
{
stringsValue="";
if(m_dgvRow!=null)
{
if(DataGridView.Columns.Contains(sColumn))
{
sValue=m_dgvRow.Cells[sColumn].Value.ToString();
}
}
returnsValue;
}
publicvoiddataGridView_DoubleClick(objectsender,EventArgse)
{
PopupGridView(e);
}
//PopupGridView
/**/
///<summary>
///弹出下拉表格并触发选择后事件
///</summary>
///<paramname="e"></param>
privatevoidPopupGridView(EventArgse)
{
if(DataGridView.SelectedRows.Count>0)
{
m_dgvRow=DataGridView.SelectedRows[0];
if(m_sDefaultColumn!=String.Empty)
{
string[]sColumnList=m_sDefaultColumn.Split(',');
foreach(stringsColumninsColumnList)
{
if(DataGridView.Columns.Contains(sColumn))
{
Items.Clear();
Items.Add(m_dgvRow.Cells[sColumn].Value.ToString());
SelectedIndex=0;
}
}
}
if(AfterSelector!=null)
{
AfterSelector(this,e);
}
}
dropDown.Close();
}
privatevoidShowDropDown()
{
if(dropDown!=null)
{
dataGridViewHost.Size=newSize(DropDownWidth-2,DropDownHeight);
dropDown.Show(this,0,this.Height);
}
}
//重写方法
protectedoverridevoidWndProc(refMessagem)
{
if(m.Msg==WM_LBUTTONDBLCLK||m.Msg==WM_LBUTTONDOWN||m.Msg==0x114||m.Msg==0x115)
{
ShowDropDown();
if(OnScroll!=null)
{
OnScroll(this,m.Msg==0x115);
}
return;
}
base.WndProc(refm);
}
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
if(dropDown!=null)
{
dropDown.Dispose();
dropDown=null;
}
}
base.Dispose(disposing);
}
}
}
欢迎大家转载,如有转载请注明文章来自:http://sufei.cnblogs.com/
签名:做一番一生引以为豪的事业;在有生之年报答帮过我的人;并有能力帮助需要帮助的人;
QQ:361983679 Email:[email protected] MSN:[email protected]