首页 > 开发 > 综合 > 正文

一个通用的DataGridTableStyle的做法

2024-07-21 02:23:09
字体:
来源:转载
供稿:网友
一个通用的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




发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表