博主這幾天就準備離職了,以後不再做.Net開發,因此這應該是我寫的最後一篇關於dev控件的博文,既然是最後一篇,那就寫的詳細一些,畫個圓滿的省略號......
本文介紹gridcontrol如何實現複選框功能,網上有幾篇這樣的文章,但功能不夠完善,按它做的還有問題,因此我就詳細的介紹我的一下實現方法供大家參考。
首先看下我的gridcontrol(由於數據部分涉及到項目的保密內容,所以呆會的實現效果就不上圖了):
我這裏有一個選擇某行後,將改行的班級名字顯示在上面的文本框的功能,全選則全部顯示。
各個控件的name:
班級文本框:barEditClass
全選複選框:checkEditAll
表格複選框:checkEditClass
表格控件:gcSelectClass、gvSelectClass
下面介紹詳細的實現方法:
第一步:拖一個gridcontrol控件,點擊最後一列,選擇columEdit屬性,在彈出的下拉框中選擇checkbox控件,即可在表格的最後一列顯示覆選。
第二步:拖一個checkEdit控件,放在表格的最後一列的列頭作爲全選複選框,但是你會發現運行時這個複選框的位置是偏的,也就是不在列頭上,下面解決這個問題,選中checkEditAll控件,將其Anchor屬性設爲Top, Right,再選中複選框列,將MinWidth和MaxWidth屬性的值設爲Width的屬性值(我這裏是104),再次運行,你會發現複選框列的大小不能改變了,全選複選框也就老老實實地呆在列頭上。
第三步:綁定數據源。我這裏用的數據源是自定義的實體類,前面的幾列放在一個字段中,後面的複選框列放在一個單獨的字段。當然你用datatable的話也是一樣的道理。在數據源中添加一個“check”字段,類型爲bool,然後將表格的複選框列的fieldname字段設爲”check“。成功綁定數據源
第四步:這一步實現選中複選框後將該行的班級名稱顯示在上面的班級文本框上。找到checkEditClass控件,在該控件的事件中創建CheckedChanged事件(選中狀態改變後觸發該事件)。下面看代碼(爲了防止程序崩潰,最好加上try...catch):
//顯示班級
gvSelectClass.CloseEditor();
gvSelectClass.UpdateCurrentRow();
string name = gvSelectClass.GetRowCellValue(gvSelectClass.FocusedRowHandle, gvSelectClass.Columns[1]).ToString();
string value = gvSelectClass.GetRowCellValue(gvSelectClass.FocusedRowHandle, gvSelectClass.Columns[4]).ToString();
//增加班級
if (value == "True")
{
if (m_className.IndexOf(name) > -1)
{
}
else
{
if (m_className == "")
{
m_className += name;
}
else
{
m_className += ",";
m_className += name;
}
}
}
//去掉班級
else
{
if (m_className.IndexOf(name) > -1)
{
string[] classNames = m_className.Split(',');
if (classNames[0] == name)
{
m_className = m_className.Replace(name + ",", "");
}
else
{
m_className = m_className.Replace("," + name, "");
}
}
}
barEditClass.EditValue = m_className;
我們一行一行的來看代碼,前兩行是在改變複選框狀態後更新數據源,可不要小瞧它們,這兩行代碼是必不可少的,如果不用會導致複選框狀態不能及時更新到數據源,進而導致錯誤結果。第三行和第四行用來獲取選中的複選框所在行的複選框狀態和班級名稱,之後的代碼增加班級和去掉班級的,班級之間以逗號間隔,這裏我定義了一個全局變量m_className,相信大家都看得懂。最後一行代碼即將要顯示的班級名字顯示在文本框barEditClass上面。
第五步:實現全選和全部取消功能。選中checkEditAll控件,在控件事件中創建CheckedChanged事件,在該事件中添加以下代碼:
if ((bool)checkEditAll.EditValue == true)
{
for (int i = 0; i < gvSelectClass.RowCount; i++)
{
gvSelectClass.SetRowCellValue(i, gvSelectClass.Columns["check"], true);
}
m_className = "";
for (int i = 0; i < gvSelectClass.RowCount; i++)
{
string name = (string)gvSelectClass.GetRowCellValue(i, gvSelectClass.Columns[1]);
if (m_className == "")
{
m_className += name;
}
else
{
m_className += ",";
m_className += name;
}
}
barEditClass.EditValue = m_className;
}
else if((bool)checkEditAll.EditValue==false)
{
for (int i = 0; i < gvSelectClass.RowCount; i++)
{
gvSelectClass.SetRowCellValue(i, gvSelectClass.Columns["check"], false);
}
m_className = "";
barEditClass.EditValue = m_className;
}
gcSelectClass.RefreshDataSource();
這個全選複選框無非就是兩個功能:設置全選狀態或全不選狀態;全選時將表格的所有行的班級顯示在文本框中,全不選時將文本框置爲空。我這麼一說相信這段代碼也就好懂了。這裏不再贅述。
到這裏就已經實現想要的功能了,當然我做的項目的功能要更復雜一些,並沒有全部寫出來。我以後也就基本告別.Net開發了,這三個月來我把dev常用的控件也基本研究透了,如果大家有任何關於dev控件的使用問題都可以在我的博文下留言,只要我有時間只要我知道都會給大家解答的,不一定對,就是相互討論嘛。謝謝!