| 发表于:2007-03-02 23:14:42 楼主 |
private datatable mydatatable; private void run()//测试函数 { mydatatable=new datatable( "namestable "); mydatatable.columns.add(new datacolumn( "name ")); mydatatable.columns.add(new datacolumn( "inf ")); dataset ds=new dataset(); ds.tables.add(mydatatable); datagrid1.datasource=ds; datagrid1.datamember= "namestable "; addgridstyle(); adddata(); } private void addgridstyle() { datagridtablestyle mygridstyle=new datagridtablestyle(); mygridstyle.mappingname= "namestable "; datagridtextboxcolumn namecolumn=new datagridtextboxcolumn(); namecolumn.mappingname= "name "; namecolumn.headertext= "inf "; mygridstyle.gridcolumnstyles.add(namecolumn); //dategridcomboboxculumn comboboxcolumnstyle=new dategridcomboboxculumn(); datagridcolumnstyle comboboxcolumnstyle=new dategridcomboboxculumn(); comboboxcolumnstyle.mappingname= "inf "; comboboxcolumnstyle.headertext= "inf "; comboboxcolumnstyle.width=100; mygridstyle.gridcolumnstyles.add(comboboxcolumnstyle); datagrid1.tablestyles.add(mygridstyle); } private void adddata() { datarow drow=mydatatable.newrow(); drow[ "name "]= "name 1 "; drow[ "inf "]= "tsm "; mydatatable.rows.add(drow); drow=mydatatable.newrow(); drow[ "name "]= "name 2 "; drow[ "inf "]= "zl "; mydatatable.rows.add(drow); drow=mydatatable.newrow(); drow[ "name "]= "name 3 "; drow[ "inf "]= "wb "; mydatatable.rows.add(drow); mydatatable.acceptchanges(); } } public class dategridcomboboxculumn : datagridcolumnstyle { private combobox mycombobox=new combobox(); private bool isediting; public dategridcomboboxculumn() : base() { mycombobox.visible=false; mycombobox.text= " "; mycombobox.items.add( "tsm "); mycombobox.items.add( "zl "); mycombobox.items.add( "wb "); } protected override void abort(int rownum) { isediting=false; //是否增加一个事件委托 mycombobox.click-=new eventhandler(mycomboboxtextchanged); invalidate(); } protected override bool commit(currencymanager datasource, int rownum) { mycombobox.bounds=rectangle.empty; mycombobox.click-=new eventhandler(mycomboboxtextchanged); if(!isediting) return false; try { string strvalue=mycombobox.text; setcolumnvalueatrow(datasource,rownum,strvalue); } catch { abort(rownum); return false; } invalidate(); return true; } protected override void edit(currencymanager source, int rownum, rectangle bounds, bool readonly, string instanttext, bool cellisvisible) { string strvalue=(string)getcolumnvalueatrow(source,rownum); if(cellisvisible) { mycombobox.bounds=new rectangle(bounds.x+2,bounds.y+2,bounds.width-4,bounds.height-4); mycombobox.text =strvalue; mycombobox.visible=true; mycombobox.click+=new eventhandler(mycomboboxtextchanged); } else { mycombobox.text =strvalue; mycombobox.visible =false; } if(mycombobox.visible) datagridtablestyle.datagrid.invalidate(bounds); } protected override size getpreferredsize(graphics g, object value) { return new size (100,mycombobox.preferredheight+2); } protected override int getminimumheight() { return mycombobox.preferredheight + 2; } protected override int getpreferredheight(graphics g, object value) { return mycombobox.preferredheight+2; } //重载之一,一个简单的版本,其他没有涉及到的参数采用了默认值 protected override void paint(graphics g, rectangle bounds, currencymanager source, int rownum) { paint(g, bounds, source, rownum, false); } //重载之二,一个简单的版本,其他没有涉及到的参数采用了默认值 protected override void paint( graphics g, rectangle bounds, currencymanager source, int rownum, bool aligntoright) { paint( g,bounds, source, rownum, brushes.red, brushes.blue, aligntoright); } protected override void paint( graphics g, rectangle bounds, currencymanager source, int rownum, brush backbrush, brush forebrush, bool aligntoright) { string strvalue=(string)getcolumnvalueatrow(source,rownum); rectangle rect=bounds; g.fillrectangle(backbrush,rect); rect.offset(0,2); rect.height-=2; g.drawstring(strvalue,this.datagridtablestyle.datagrid.font,forebrush,rect); } protected override void setdatagridincolumn(datagrid value) { base.setdatagridincolumn (value); if(mycombobox.parent!=null) { mycombobox.parent.controls.remove(mycombobox); } if(value!=null) { value.controls.add(mycombobox); } } private void mycomboboxtextchanged(object sender,eventargs e) { this.isediting=true; base.columnstartedediting(mycombobox); } } } 错误:当你点击inf字段的某一项后(一定不能在combobox上选择项目,如果选择了,错误将不会发生,这也是很奇怪的地方),再点击另一个inf字段的项时,就会出现 /////////////////////////错误//////////////////////////////////// 未处理的“system.nullreferenceexception”类型的异常出现在 system.windows.forms.dll 中。 其他信息: 未将对象引用设置到对象的实例 //////////////////////////////////////////////////////////////// 怀疑dategridcomboboxculumn 的问题,但怎么也找不出 |
|
|
|
|