如何在DataGrid中某一列既有图标又有数据,而且能够实现什么样的数据显示什么样的图标。对于这样的列,就只能是自己重定义一个DataGridColumn了(在2.0中有一个DataGridImageColumn,但是它好像还只能显示图标,对于数据没有办法显示,说真的2.0的变化有点大,很多东西还不会用
)。在这里也定义了一个 DataGridImageColumn,继承DataGridTextBoxColumn。主要功能是能够显示指定的图标,并且也能够显示对应的数据信息。
为了显示的图标不在DataGridColumn中定死,故先定义了一个委托
1
public delegate void FormatImageCellEventHandler(object sender, DataGridImageCellEventArgs e); 和 DataGridImageCellEventArgs
public class DataGridImageCellEventArgs:EventArgs

{
//列
private string _column;
//行
private int _row;
//需要显示的图片信息
private Image _image;

public DataGridImageCellEventArgs(string ColumnName,int RowNum)

{
this.Column = ColumnName;
this.Row = RowNum;
}

public Image Image

{
get

{
return _image;
}
set

{
_image = value;
}
}

public string Column

{
get

{
return _column;
}
set

{
_column = value;
}
}

public int Row

{
get

{
return _row;
}
set

{
_row = value;
}
}

}
注意这里的图片格式是 16×16
再实现DataGridImageColumn
public class DataGridImageBarColumn:System.Windows.Forms.DataGridTextBoxColumn

{
private int _rowNum=-1;
public DataGridImageBarColumn():base()

{
}


/**//// <summary>
/// 设置列图片信息
/// </summary>
public event FormatImageCellEventHandler SetImage;



protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)

{
Rectangle rect = bounds;
if(this.SetImage!=null)

{
DataGridImageCellEventArgs ei = new DataGridImageCellEventArgs(this.MappingName,rowNum);
//通过这个事件获取显示的图片信息
this.SetImage(this,ei);
// this.TextBox.Left = bounds.Location.X+(ei.Number+1)*16;
// this.TextBox.Width = bounds.Width - (ei.Number+1)*16;
rect =new Rectangle(bounds.Location.X+16,
bounds.Location.Y,bounds.Width-(ei.Number+1)*16,bounds.Height);
}

base.Edit(source,rowNum, rect, readOnly, instantText , cellIsVisible);


_rowNum = rowNum;
}
protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight)

{
DataGridImageCellEventArgs ei = new DataGridImageCellEventArgs(this.MappingName,rowNum);
if(this.SetImage!=null)

{
this.SetImage(this,ei);
}

DataRowView drv = source.List[rowNum] as DataRowView;
if(drv == null)
return;

Rectangle rect =bounds;
if(!drv.Row.IsNull(this.MappingName))

{
int leftX = 16;
g.FillRectangle(Brushes.White,bounds);
g.DrawImage(ei.Image,bounds.Location.X+leftX,bounds.Location.Y);
rect = new Rectangle(bounds.X+16+leftX,bounds.Y+2,bounds.Width-17-leftX,bounds.Height);
}
base.Paint(g, rect, source, rowNum, backBrush, foreBrush, alignToRight);
}
} 这样在定义DataGridColumnStyle时可以定义这个列信息,犹如定义DataGridTextColumn,但是要比定义DataGridTextClumn多一个 SetImage事件的定义 ,这个事件是获取图片信息的。
在下一篇中准备再次重写这个类,来实现DataGrid中 树的概念。和树一样可以有一种层叠的感觉。