一般來說,每一個字段的內容會單獨顯示于datagridview控件的一個數據行中。問題是,某些字段擁有大量文字數據,我是不是能夠讓該字段的內容以跨數據行的方式來顯示,以便在有限的畫面空間中的呈現出更完整的內容呢?答案當然是肯定的。
以圖表1所示的執行畫面而言,「自傳」字段的內容并未單獨顯示于一個數據行中,而是以橫跨數據行的方式,顯示在同筆數據列之各字段內容的下方。相關程序代碼列示如下:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.text;
using system.windows.forms;
using system.data.sqlclient;
…
…
…
private int oldrowindex = 0;
private const int custom_content_height = 80;
private dataset mydataset;
private void ch13_demoform009_load(object sender, eventargs e)
{
padding newpadding = new padding(0, 1, 0, custom_content_height);
this.datagridview1.rowtemplate.defaultcellstyle.padding = newpadding;
this.datagridview1.rowtemplate.defaultcellstyle.selectionbackcolor =
color.transparent;
this.datagridview1.rowtemplate.height += custom_content_height;
this.datagridview1.allowusertoaddrows = false;
this.datagridview1.editmode = datagridvieweditmode.editonkeystrokeorf2;
this.datagridview1.cellborderstyle = datagridviewcellborderstyle.none;
this.datagridview1.selectionmode = datagridviewselectionmode.fullrowselect;
mydataset = loaddatatodataset();
if(mydataset != null)
{
// 將 bindingsource 組件系結至數據集對象中的「飛狐工作室」數據表。
this.bindingsource1.datamember = "飛狐工作室";
this.bindingsource1.datasource = mydataset;
this.bindingsource1.allownew = false;
// 將 bindingnavigator 控件的數據來源也設定成 bindingsource 組件
//,如此一來,就可以使用 bindingnavigator 控件去導覽
// datagridview 控件中的數據列。
this.bindingnavigator1.bindingsource = this.bindingsource1;
this.datagridview1.datasource = this.bindingsource1;
}
else
{
return;
}
this.datagridview1.columns[4].visible = false;
this.datagridview1.columns[0].sortmode =
datagridviewcolumnsortmode.notsortable;
this.datagridview1.columns[2].sortmode =
datagridviewcolumnsortmode.notsortable;
this.datagridview1.columns[3].sortmode =
datagridviewcolumnsortmode.notsortable;
this.datagridview1.autoresizerows(
datagridviewautosizerowsmode.allcellsexceptheaders);
}
private void datagridview1_columnwidthchanged(object sender,
datagridviewcolumneventargs e)
{
this.datagridview1.invalidate();
}
private void datagridview1_currentcellchanged(object sender, eventargs e)
{
if(oldrowindex != -1)
{
this.datagridview1.invalidaterow(oldrowindex);
}
oldrowindex = this.datagridview1.currentcelladdress.y;
}
private void datagridview1_rowprepaint(object sender,
datagridviewrowprepainteventargs e)
{
e.paintparts = e.paintparts & (~datagridviewpaintparts.focus);
if((e.state & datagridviewelementstates.selected) ==
datagridviewelementstates.selected)
{
rectangle rowbounds = new rectangle(
this.datagridview1.rowheaderswidth, e.rowbounds.top,
this.datagridview1.columns.getcolumnswidth(
datagridviewelementstates.visible) -
this.datagridview1.horizontalscrollingoffset + 1,
e.rowbounds.height);
system.drawing.drawing2d.lineargradientbrush backbrush =
new system.drawing.drawing2d.lineargradientbrush(rowbounds,
this.datagridview1.defaultcellstyle.selectionbackcolor,
e.inheritedrowstyle.forecolor,
system.drawing.drawing2d.lineargradientmode.horizontal);
try
{
e.graphics.fillrectangle(backbrush, rowbounds);
}
finally
{
backbrush.dispose();
}
}
}
private void datagridview1_rowpostpaint(object sender,
datagridviewrowpostpainteventargs e)
{
rectangle rowbounds = new rectangle(this.datagridview1.rowheaderswidth,
e.rowbounds.top, this.datagridview1.columns.getcolumnswidth(
datagridviewelementstates.visible) -
this.datagridview1.horizontalscrollingoffset + 1, e.rowbounds.height);
solidbrush forebrush = null;
try
{
if((e.state & datagridviewelementstates.selected) ==
datagridviewelementstates.selected)
{
forebrush = new solidbrush(e.inheritedrowstyle.selectionforecolor);
}
else
{
forebrush = new solidbrush(e.inheritedrowstyle.forecolor);
}
object recipe =
this.datagridview1.rows.sharedrow(e.rowindex).cells[4].value;
if(!(recipe == null))
{
string text = recipe.tostring();
rectangle textarea = rowbounds;
rectanglef clip = textarea;
textarea.x -= this.datagridview1.horizontalscrollingoffset;
textarea.width += this.datagridview1.horizontalscrollingoffset;
textarea.y += rowbounds.height - e.inheritedrowstyle.padding.bottom;
textarea.height -= rowbounds.height -
e.inheritedrowstyle.padding.bottom;
textarea.height =
(textarea.height / e.inheritedrowstyle.font.height) *
e.inheritedrowstyle.font.height;
clip.width -= this.datagridview1.rowheaderswidth + 1 - clip.x;
clip.x = this.datagridview1.rowheaderswidth + 1;
rectanglef oldclip = e.graphics.clipbounds;
e.graphics.setclip(clip);
e.graphics.drawstring(text, e.inheritedrowstyle.font,
forebrush, textarea);
e.graphics.setclip(oldclip);
}
}
finally
{
forebrush.dispose();
}
if (this.datagridview1.currentcelladdress.y == e.rowindex)
{
e.drawfocus(rowbounds, true);
}
}
private void datagridview1_rowheightchanged(
object sender, datagridviewroweventargs e)
{
int preferrednormalcontentheight =
e.row.getpreferredheight(e.row.index,
datagridviewautosizerowmode.allcellsexceptheader, true) -
e.row.defaultcellstyle.padding.bottom;
padding newpadding = e.row.defaultcellstyle.padding;
newpadding.bottom = e.row.height - preferrednormalcontentheight;
e.row.defaultcellstyle.padding = newpadding;
}
// 本程序會連接至數據來源并建立所需的 dataset 對象。
private dataset loaddatatodataset()
{
// 利用 sqlconnectionstringbuilder 對象來構建連接字符串。
sqlconnectionstringbuilder sqlstringbuilder =
new sqlconnectionstringbuilder();
sqlstringbuilder.datasource = @"(local)/sqlexpress";
sqlstringbuilder.initialcatalog = "北風貿易";
sqlstringbuilder.integratedsecurity = true;
// 建立一個數據集。
dataset ds = new dataset();
try
{
using (sqlconnection northwindconnection =
new sqlconnection(sqlstringbuilder.connectionstring))
{
sqlcommand cmdliming = new sqlcommand(
"select 姓名,員工性別,出生日期, 目前薪資, 自傳" +
" from dbo.飛狐工作室 where 自傳 is not null",
northwindconnection);
northwindconnection.open();
using (sqldatareader drliming = cmdliming.executereader())
{
ds.load(
drliming,
loadoption.overwritechanges,
new string[] { "飛狐工作室" });
}
}
}
catch (exception)
{
messagebox.show(
"要能夠順利執行本范例程序,您的計算機必須已安裝 sql server " +
"express,并且必須已附加了本書所附的「北風貿易」數據庫。" +
"關于如何安裝 sql server express,請參閱附錄或相關文件說明。");
// 無法連接至 sql server。
return null;
}
return ds;
}
|
新聞熱點
疑難解答