繼續發佈VS2005下DataGridView 的多種樣式列控件

原文地址爲:繼續發佈VS2005下DataGridView 的多種樣式列控件

版權聲明:如有轉載,下載源碼者如轉到第三方網站必須註明博客園隨風飄散否則作者有追究法律責任的權利。
VS2005已經發佈好久了,但對DataGridView 的使用,在網上的資料還比較少,DataGridView 無論是美觀與功能方面都是DataGrid所不能比的,應該說DataGridView 不是DataGrid的升級,因爲DataGridView 使用了一套全新的構建方式,引入了DataGridViewCell ,DataGridViewColumn,DataGridViewRow,等,新的概念,也使編程更容易了,它提供了
DataGridViewTextBoxColumn,DataGridViewImageColumn,DataGridLinkColumn,DataGridViewComboBoxColumn,DataGrid
ViewButtonColumn,DataGridViewCheckBoxColumn,等樣式列
但我們常用的遠不只這些樣式列,所以我不想把所有的樣式列都給大家做出來,我只是想拋磚引玉通過我自己做的四個樣式列來讓大家掌握自定義DataGridView樣式列的方法.由於時間倉促功能不是很完善,望大家見諒,好了大家先看看4個控件的效果.

一:DataGridViewMaskedTextBoxColumn(正則表達式樣式列)


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Design;

namespace WindowsApplication23
{
    
//Cell編輯類,實現IDataGridViewEditingControl接口,可參照ComboBoxEditingControl的寫法
    public class DataGridViewMaskedTextBoxEditingControl:MaskedTextBox,IDataGridViewEditingControl
    
{
        
protected int rowIndex;
        
protected DataGridView dataGridView;
        
protected bool valueChanged = false;

        
public DataGridViewMaskedTextBoxEditingControl()
        
{
            
base.TabStop = false;
        }

        
//重寫基類(MakedTextBox)的OnTextChanged方法
        protected override void OnTextChanged(EventArgs e)
        
{
            
base.OnTextChanged(e);
            NotifyDataGridViewOfValueChange();
        }

        
//  當text值發生變化時,通知DataGridView
        private void NotifyDataGridViewOfValueChange()
        
{
            valueChanged 
= true;
            dataGridView.NotifyCurrentCellDirty(
true);
        }

        
/**//// <summary>
        
/// 設置對齊方式
        
/// </summary>
        
/// <param name="align"></param>
        
/// <returns></returns>

        private static HorizontalAlignment translateAlignment(DataGridViewContentAlignment align)
        
{
            
switch (align)
            
{
                
case DataGridViewContentAlignment.TopLeft:
                
case DataGridViewContentAlignment.MiddleLeft:
                
case DataGridViewContentAlignment.BottomLeft:
                    
return HorizontalAlignment.Left;

                
case DataGridViewContentAlignment.TopCenter:
                
case DataGridViewContentAlignment.MiddleCenter:
                
case DataGridViewContentAlignment.BottomCenter:
                    
return HorizontalAlignment.Center;

                
case DataGridViewContentAlignment.TopRight:
                
case DataGridViewContentAlignment.MiddleRight:
                
case DataGridViewContentAlignment.BottomRight:
                    
return HorizontalAlignment.Right;
            }


             
return HorizontalAlignment.Left;
        }


        
/**//// <summary>
        
/// 在Cell被編輯的時候光標顯示
        
/// </summary>

        public Cursor EditingPanelCursor
        
{
            
get
            
{
                
return Cursors.IBeam;
            }

        }

        
/**//// <summary>
        
/// 獲取或設置所在的DataGridView
        
/// </summary>

        public DataGridView EditingControlDataGridView
        
{
            
get
            
{
                
return dataGridView;
            }


            
set
            
{
                dataGridView 
= value;
            }

        }


        
/**//// <summary>
        
/// 獲取或設置格式化後的值
        
/// </summary>

        public object EditingControlFormattedValue
        
{
            
set
            
{
                Text 
= value.ToString();
                NotifyDataGridViewOfValueChange();
            }

            
get
            
{
                
return this.Text;
            }


        }

        
/**//// <summary>
        
/// 獲取控件的Text值
        
/// </summary>
        
/// <param name="context">錯誤上下文</param>
        
/// <returns></returns>

        public virtual object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        
{
            
return Text;
        }


        
/**//// <summary>
        
/// 編輯鍵盤
        
/// </summary>
        
/// <param name="keyData"></param>
        
/// <param name="dataGridViewWantsInputKey"></param>
        
/// <returns></returns>

        public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        
{
            
switch (keyData & Keys.KeyCode)
            
{
                
case Keys.Right:
                    
if (!(this.SelectionLength == 0
                          
&& this.SelectionStart == this.ToString().Length))
                    
{
                        
return true;
                    }

                    
break;

                
case Keys.Left:
                    
if (!(this.SelectionLength == 0
                          
&& this.SelectionStart == 0))
                    
{
                        
return true;
                    }

                    
break;

                
case Keys.Home:
                
case Keys.End:
                    
if (this.SelectionLength != this.ToString().Length)
                    
{
                        
return true;
                    }

                    
break;

                
case Keys.Prior:
                
case Keys.Next:
                    
if (this.valueChanged)
                    
{
                        
return true;
                    }

                    
break;

                
case Keys.Delete:
                    
if (this.SelectionLength > 0 || this.SelectionStart < this.ToString().Length)
                    
{
                        
return true;
                    }

                    
break;
            }

            
return !dataGridViewWantsInputKey;
        }

        
        
public void PrepareEditingControlForEdit(bool selectAll)
        
{
            
if (selectAll)
            
{
                SelectAll();
            }

            
else
            
{
                
this.SelectionStart = this.ToString().Length;
            }

        }

        
public virtual bool RepositionEditingControlOnValueChange
        
{
            
get
            
{
                
return false;
            }

        }

        
/**//// <summary>
        
/// 控件所在行
        
/// </summary>

        public int EditingControlRowIndex
        
{
            
get
            
{
                
return this.rowIndex;
            }


            
set
            
{
                
this.rowIndex = value;
            }

        }

        
/**//// <summary>
        
/// 設置樣式
        
/// </summary>
        
/// <param name="dataGridViewCellStyle"></param>

        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        
{
            
this.Font = dataGridViewCellStyle.Font;
            
this.ForeColor = dataGridViewCellStyle.ForeColor;
            
this.BackColor = dataGridViewCellStyle.BackColor;
            
this.TextAlign = translateAlignment(dataGridViewCellStyle.Alignment);
        }



        
/**//// <summary>
        
/// 是否值發生了變化
        
/// </summary>

        public bool EditingControlValueChanged
        
{
            
get
            
{
                
return valueChanged;
            }


            
set
            
{
                
this.valueChanged = value;
            }

        }

    }

}


(二)DataGridViewFormat(可以獲取格式的列,如N2 ,1234,11)
(三)DataGridViewTreeViewColumn(下拉列表樹控件)

(四)DataGridViewDateTimeColumn(日期選擇列控件)

控件源碼下載
/Files/CodeAnyWhere/WindowsApplication23.rar


轉載請註明本文地址:繼續發佈VS2005下DataGridView 的多種樣式列控件
發佈了0 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章