欢迎光临
我们一直在努力

一个通用的DataGridTableStyle的做法-.NET教程,数据库应用

建站超值云服务器,限时71元/月

一个通用的datagridtablestyle的做法

哈,这两天都喜欢写“通用”的东西。

这个类,可以实现自适应列宽、只读、时分显示、事件、任意位置加列、单击单元格背景色设置等等,操作简便。只是时间关系(明天要出去一趟),今天没办法完善。仅供参考,你可以加入别的东西。以下只列代码了,不清楚的自己试用查资料就行了。

public class tablestyle

private m_datagridtablestyle as datagridtablestyle

private m_datagrid as datagrid

private m_datatable as datatable

//添加事件处理,在此只考虑datagridtextboxcolumn双击事件

public delegate sub clickeventhandler(byval sender as object, byval e as system.eventargs)

public event gridtextboxdoubleclickevent as clickeventhandler

public sub gridtextbox_doubleclick(byval sender as object, byval e as system.eventargs)

raiseevent gridtextboxdoubleclickevent(sender, e)

end sub

//设置datagrid

public property [datagrid]() as datagrid

get

return m_datagrid

end get

set(byval value as datagrid)

m_datagrid = value

end set

end property

//返回模板

public readonly property [datagridtablestyle]() as datagridtablestyle

get

return m_datagridtablestyle

end get

end property

//初始化

public sub initialize()

//判断mdatagrid数据源类型

//如果绑定的是dataset或dataviewmanager或没有绑定任何数据源,则退出,

if typeof m_datagrid.datasource is system.data.dataset orelse _

typeof m_datagrid.datasource is system.data.dataviewmanager orelse _

m_datagrid.datasource is nothing then exit sub

//以下分别考虑两种数据源,一是dataview,一是datatable

if typeof m_datagrid.datasource is system.data.dataview then

m_datatable = ctype(m_datagrid.datasource, dataview).table

else

m_datatable = ctype(m_datagrid.datasource, datatable)

end if

m_datagridtablestyle = new datagridtablestyle

m_datagridtablestyle.mappingname = m_datatable.tablename

//加columnstyle

dim mdatacolumn as datacolumn

dim mcolumnstyle as datagridcolumnstyle

for each mdatacolumn in m_datatable.columns

select case mdatacolumn.datatype.name

case "boolean"

mcolumnstyle = new datagridboolcolumn

case else

mcolumnstyle = new datagridtextboxcolumn

addhandler ctype(mcolumnstyle, datagridtextboxcolumn).textbox.doubleclick, addressof gridtextbox_doubleclick

end select

//绑定到datatable的column

with mcolumnstyle

.mappingname = mdatacolumn.columnname

.headertext = mdatacolumn.columnname

end with

//加入到datagridtablestyle

m_datagridtablestyle.gridcolumnstyles.add(mcolumnstyle)

next

//将datagridtablestyle绑定到datagrid

m_datagrid.tablestyles.clear()

m_datagrid.tablestyles.add(m_datagridtablestyle)

end sub

//自适应宽度

public sub autoextend()

if m_datagridtablestyle is nothing then exit sub

取各字段的最大字节数,包括字段名和值

dim mrow as datarow

dim mcolumn as datacolumn

for each mcolumn in m_datatable.columns

m_datagridtablestyle.gridcolumnstyles(mcolumn.columnname).width = getcolumnmaxwidth(0, mcolumn.columnname)

next

for each mrow in m_datatable.rows

for each mcolumn in m_datatable.columns

if not isdbnull(mrow(mcolumn.columnname)) then

m_datagridtablestyle.gridcolumnstyles(mcolumn.columnname).width = _

getcolumnmaxwidth(m_datagridtablestyle.gridcolumnstyles(mcolumn.columnname).width, mrow(mcolumn.columnname).tostring)

end if

next

next

参照datagrid的graphics赋实际宽度

for each mcolumnstyle as datagridcolumnstyle in m_datagridtablestyle.gridcolumnstyles

mcolumnstyle.width = columnwidth(mcolumnstyle.width)

next

end sub

private function getcolumnmaxwidth(byval maxwidth as integer, byval mstring as string) as integer

dim mlength as integer

mlength = system.text.encoding.default.getbytes(mstring).length()

if maxwidth < mlength then

return mlength

else

return maxwidth

end if

end function

private function columnwidth(byval maxwidth as integer) as integer

dim mgraphics as graphics = m_datagrid.creategraphics

dim mcolwidth as single

mcolwidth = mgraphics.measurestring(new string(ctype("a", char), maxwidth), m_datagrid.font).width + 2

return ctype(mcolwidth, integer)

end function

//在某列后添加一列

public sub addcolumn(byval poscolumnname as string, byval columnname as string)

if m_datagridtablestyle is nothing then exit sub

if not m_datatable.columns.contains(poscolumnname) then exit sub

if m_datatable.columns.contains(columnname) then exit sub

dim tmpstyle as new datagridtablestyle

for each mcolumnstyle as datagridcolumnstyle in m_datagridtablestyle.gridcolumnstyles

tmpstyle.gridcolumnstyles.add(mcolumnstyle)

if mcolumnstyle.headertext.equals(poscolumnname) then

dim tmptextcolumn as new datagridtextboxcolumn

m_datatable.columns.add(columnname)

tmptextcolumn.headertext = columnname

tmptextcolumn.mappingname = columnname

tmpstyle.gridcolumnstyles.add(tmptextcolumn)

end if

next

m_datagrid.tablestyles.clear()

tmpstyle.mappingname = m_datagridtablestyle.mappingname

m_datagridtablestyle = tmpstyle

m_datagrid.tablestyles.add(m_datagridtablestyle)

end sub

//不显示null

public writeonly property notshownull() as boolean

set(byval value as boolean)

for each mcolumnstyle as datagridcolumnstyle in m_datagridtablestyle.gridcolumnstyles

if value then

mcolumnstyle.nulltext = ""

else

mcolumnstyle.nulltext = "(null)"

end if

next

end set

end property

//如果是日期类型,显示时间

public writeonly property showtimeformat() as boolean

set(byval value as boolean)

for each mcolumnstyle as datagridcolumnstyle in m_datagridtablestyle.gridcolumnstyles

if not mcolumnstyle.mappingname = "" andalso m_datatable.columns(mcolumnstyle.mappingname).datatype.name.indexof("date") <> -1 then

if value then

ctype(mcolumnstyle, datagridtextboxcolumn).format = "yyyy-mm-dd hh:mm:ss"

else

ctype(mcolumnstyle, datagridtextboxcolumn).format = "yyyy-mm-dd"

end if

end if

next

end set

end property

个别编辑,除逻辑类型外

public readonly property textcolumnstyle(byval columnname as string) as datagridtextboxcolumn

get

if not m_datatable.columns(columnname) is nothing andalso not m_datatable.columns(columnname).datatype.name.equals("boolean") then

return ctype(m_datagridtablestyle.gridcolumnstyles(columnname), datagridtextboxcolumn)

else

return nothing

end if

end get

end property

end class

测试

dim mytablestyle as new tablestyle

private sub button1_click(byval sender as system.object, byval e as system.eventargs) handles button1.click

dim ds as new dataset

me.sqlconnection1.open()

me.sqldataadapter1.fill(ds)

me.sqlconnection1.close()

me.datagrid1.datasource = ds.tables(0)

addhandler mytablestyle.gridtextboxdoubleclickevent, addressof

end sub

private sub button2_click(byval sender as system.object, byval e as system.eventargs) handles button2.click

with mytablestyle

.datagrid = me.datagrid1

.initialize()

end with

me.datagridtextcolumn_doubleclick

end sub

private sub button3_click(byval sender as system.object, byval e as system.eventargs) handles button3.click

mytablestyle.notshownull = true

mytablestyle.showtimeformat = true

end sub

private sub button4_click(byval sender as system.object, byval e as system.eventargs) handles button4.click

mytablestyle.notshownull = false

mytablestyle.showtimeformat = false

end sub

private sub button5_click(byval sender as system.object, byval e as system.eventargs) handles button5.click

mytablestyle.datagridtablestyle.gridcolumnstyles(2).readonly = true

end sub

private sub button6_click(byval sender as system.object, byval e as system.eventargs) handles button6.click

mytablestyle.addcolumn("姓名", "hello")

mytablestyle.autoextend()

end sub

private sub button7_click(byval sender as system.object, byval e as system.eventargs) handles button7.click

mytablestyle.textcolumnstyle("姓名").width=0

end sub

private sub datagridtextcolumn_doubleclick(byval sender as object, byval e as system.eventargs)

dim mtextbox as textbox = ctype(sender, textbox)

mtextbox.backcolor = system.drawing.color.blue

msgbox(mtextbox.text)

end sub

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 一个通用的DataGridTableStyle的做法-.NET教程,数据库应用
分享到: 更多 (0)

相关推荐

  • 暂无文章