C#仿QQ皮肤-ComboBoxDataGridView

C#仿QQ皮肤-实现原理系列文章导航
http://www.cnblogs.com/sufei/archive/2010/03/10/1682847.html

大家还是先来看看效果吧

C#仿QQ皮肤-ComboBoxDataGridViewC#仿QQ皮肤-ComboBoxDataGridView

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


这个其实是控件里是没有的,那天在博客上看到一个同志在写这个控件,所性抄一点思想,在结合我和控件就加上了,还挺好用的,呵呵,有了这个控件大家就不用再为绑定一个表那个字段面苦了,可以一下自全部绑定,实现很简单大家一起来看看吧

第一步我们新建一个组件名称 为ComboBoxDataGridView

其实就是dataGridViewHost 和ToolStripDropDown之间的相互配合

这个控件是继承自我皮肤里的控件Combox这个大家一会儿看代码

我们要声明一个委托来调用 构造DataGridViw的方法

C#仿QQ皮肤-ComboBoxDataGridViewC#仿QQ皮肤-ComboBoxDataGridView代码
<!--<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);
}

我们先来看看DrawDataGridView();
方法吧

C#仿QQ皮肤-ComboBoxDataGridViewC#仿QQ皮肤-ComboBoxDataGridView代码
<!--<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);
}

有关DatagridView和Combox的实现 代码大家请参考我的皮肤系统,呵呵

下面我把代码都放上来各们看看吧也提提建议

C#仿QQ皮肤-ComboBoxDataGridViewC#仿QQ皮肤-ComboBoxDataGridView代码
<!--<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);
}
}
}

欢迎大家转载,如有转载请注明文章来自:http://sufei.cnblogs.com/

签名:做一番一生引以为豪的事业;在有生之年报答帮过我的人;并有能力帮助需要帮助的人;

QQ:361983679 Email:[email protected] MSN:[email protected]