您的位置:程序门 -> .net技术 -> c#



dategrid绑定combobox出错(未将对象引用设置到对象的实例)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


dategrid绑定combobox出错(未将对象引用设置到对象的实例)
发表于: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   的问题,但怎么也找不出
发表于:2007-03-02 23:58:081楼 得分:0
在点击combobox时一定给某个类实例化了
发表于:2007-03-03 00:19:152楼 得分:0
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);
}
}
这个函数已经防止 "在点击combobox时一定给某个类实例化了 "
发表于:2007-03-03 09:25:223楼 得分:0
先顶一下   还没仔细看
发表于:2007-03-03 09:27:194楼 得分:0
点击combobox时一定给某个类实例化了     up


快速检索

最新资讯
热门点击