我們如果想自定義實現datagridview的某列,例如是datagridview的某列顯示為乙個日期控制項datatimepicker,或者顏色拾取器控制項colorpicker,我們可以大致按如下模式來設計
1. 設定列,建立乙個類,使之繼承datagridviewcolumn列
public partial class datagridviewcalendarcolumn : datagridviewcolumn
public datagridviewcalendarcolumn():base(new datagridviewcalendarcell())
//獲取或設定用於建立新單元格的模板。
public override datagridviewcell celltemplate
setbase.celltemplate = value;}}
2.設定單元格,建立乙個類,使之繼承datagridviewtextboxcell列
public class datagridviewcalendarcell : datagridviewtextboxcell
//rowindex
//型別:
system..::
.int32
//該單元格父行的索引。
//initialformattedvalue
//型別:
system..::
.object
//要在控制項中顯示的初始值。
//datagridviewcellstyle
//型別:
system.windows.forms..::
.datagridviewcellstyle
//乙個 datagridviewcellstyle
,確定寄宿控制項的外觀。
public override void initializeeditingcontrol(int rowindex, object initialformattedvalue, datagridviewcellstyle datagridviewcellstyle)
//獲取或設定單元格中值的資料型別。
public override type valuetype
}//獲取單元格的寄宿編輯控制項的型別。
public override type edittype
}//獲取新記錄所在行中單元格的預設值
public override object defaultnewrowvalue}}
3.設定單元格處於編輯狀態顯示的控制項,建立乙個類,使之繼承要在單元格顯示的控制項和idatagridvieweditingcontrol介面
// idatagridvieweditingcontrol 介面
//定義承載在 datagridview 的單元格內的控制項的常見功能。
class datagridviewcalendareditingcontrol : datetimepicker, idatagridvieweditingcontrol
//實現 the idatagridvieweditingcontrol.editingcontrolformattedvalue屬性
//獲取或設定編輯器正在修改的單元格的格式化值。
//格式化值以值在控制項的使用者介面上的顯示形式表示該值。格式化值的絕對值甚至資料型別都可能與控制項中包含的實際值不同。
public object editingcontrolformattedvalue
set}
}// implements the idatagridvieweditingcontrol.editingcontroldatagridview
// property.//用於設定當前的datagridview
public datagridview editingcontroldatagridview
set}
// 實現 the idatagridvieweditingcontrol.editingcontrolrowindex
// property.//設定處於編輯狀態的datatridview控制項的行索引
public int editingcontrolrowindex
set}
// implements the idatagridvieweditingcontrol.editingcontrolvaluechanged
// property.獲取或設定控制項值是否發生變化
public bool editingcontrolvaluechanged
set}
// 實現 the idatagridvieweditingcontrol.editingcontrolwantsinputkey
// method. 確定指定的鍵是應由編輯控制項處理的常規輸入鍵,還是應由 datagridview
處理的特殊鍵。
//datagridview
控制項呼叫此方法確定是要處理某個輸入鍵還是讓編輯控制項處理它。
//如果 keydata
包括 up
或 down
值,或者如果顯示了下拉列表並且 keydata
包括 escape
或 enter
值,則此方法返回true。
//如果 //datagridviewwantsinputkey
為false,此方法也會返回true。否則,此方法返回false。
public bool editingcontrolwantsinputkey(keys keydata, bool datagridviewwantsinputkey)
}// implements the idatagridvieweditingcontrol.editingpanelcursor
// property
//編輯面板是在 datagridview
控制項處於編輯模式時用來承載編輯控制項的 panel
。實際的編輯控制項可能不會覆蓋編輯面板的整個區域。
//在這種情況下,editingpanelcursor 實現應返回當滑鼠指標位於面板上方但不位於控制項上方時使用的游標。通常,
//您會希望返回與控制項使用的游標相同的游標。如果希望更改當指標位於控制項上方時顯示的游標,必須設定 cursor
屬性。可以在
//idatagridvieweditingcontrol
實現的建構函式中設定此屬性,也可以在 prepareeditingcontrolforedit
實現中設定。
public cursor editingpanelcursor
}// 實現 the idatagridvieweditingcontrol.geteditingcontrolformattedvalue
// method.//檢索單元格的格式化值。
public object geteditingcontrolformattedvalue(datagridviewdataerrorcontexts context)
//準備當前選中的單元格以進行編輯。
//selectall
//型別:
system..::
.boolean
//為true,則選擇單元格的全部內容;否則為false。
//此方法的用途是準備控制項及其內容以進行編輯。例如,您可能想要將插入點放在內容的末尾,或者更改內容的對齊方式。
public void prepareeditingcontrolforedit(bool selectall)
//實現 the idatagridvieweditingcontrol.repositioneditingcontrolonvaluechange
// property.
//取得值,指出每當值變更時是否需要重新定位儲存格內容。
public bool repositioneditingcontrolonvaluechange
}//當datatimepicker值變化時,通知datagridview
protected override void onvaluechanged(eventargs eventargs)
#endregion
}
DataGridView自定義排序
net自帶datagridview排序貌似最終都是用datagridview.sort 發現當是用排序後,datagridview將把排序前的行樣式等重置,仔細測試後覺得貌似是排序時datagridview重新繫結了資料來源,具體不得而知.實在沒有辦法破解,我也不想重新寫比較來排序,用了最土的辦法,...
讓Datagridview支援自定義回車事件
vb.net中的datagridview控制項,無法對單元格的回車事件,進行繫結,這對程式設計師來說,是個 煩。vb.net中datagridview的回車事件預設是單元格下移動的功能,無法改變。下面提供一種方法,實現對datagridview中的回車事件進行繫結。首先過載系統事件,遮蔽原來的事件,...
自定義 如何自定義協議
何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...