在c#中实现DataGridView中自定义控件列

时间:2022-08-31 07:57:48

昨天晚上临睡前写了长长的一大堆,后来睡下去的时候,包括今天早上眼睛睁开来,发觉昨晚写的东西里思路还是有点混乱的。于是,今天再来不补充篇。


要实现的内容先表述下:新闻标题列表页上,呈现如下

新闻日期1:新闻标题1【所属类别名称】

新闻日期2:新闻标题2【所属类别名称】

。。。


新闻标题和日期同属一张数据表中,类别ID也在该表中,但类别名称需要去另外张表中查找。昨晚文章中其实现在回头想来,关于这个问题它所提供的核心解决方案是利用SQL的联表查询语句,来一次性创建所需要的记录集。后来睡下去后回想了下,其实这个核心方法,与到底使用SqlDataReader还是DataSet其实是无关的。到是这个方法唯一需要注意的问题是,联表查询中所涉及的这两张,必须是来自同一个数据库的(数据库名相同)!至于到底是自己傻乎乎地循环输入表格,还是直接绑定在显示控件比如DataList、DataGridView上,这都可以。


那么,假如比如上面提到的无法联表查询的情况时,又要实现这样的功能时,该如何处理?


写到这里的时候,我忽然修改了下文章标题,将问题更加简单化和明确化为一种效果的实现:在c#中实现DataGridView中自定义控件列。能否实现这样的效果的话,基本上问题也就讲清楚了。上面的一大段可以忽略了。


DataGrid1.AutoGenerateColumns=false; //要自定义DataGridView控件列,必须先将它的自动生成列功能停掉

TemplateColumn tm=new TemplateColumn();

tm.ItemTemplate=new ColumnTemplate1();

tm.HeaderText="新闻类别";

DataGrid1.Columns.Add(tm); //至此,DataGridView控件中的第一个列已经创建,DataGridView中自定义需要使用模板列对象(TemplateColumn)

//当前尚未加载数据,只是创建了列和列名

//下面对DataGridView整体绑定数据,即比如新闻日期和标题数据

。。。

this.DataGrid1.Databind(); //整体大部分数据绑定完毕,定制列除外,比如新闻类别列

//假设在新闻列表显示页上的DataGrid中有个用于显示类别的控件是个叫category的下拉框控件(这里我暂时从某篇文献中摘录下拉框加载的例子,暂没有试验如何绑定显示特定值)

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) //DataGrid定制列的数据绑定要使用ItemDataBound事件

{

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]); 
    SqlDataAdapter da=new SqlDataAdapter("select * from dep",conn); 
    DataSet ds=new DataSet(); 
    da.Fill(ds,"table1"); 
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem) 
    { 
    DropDownList ddl=(DropDownList)e.Item.FindControl("dep");
//用e.Item.FindControl来查找到需要绑定值得目标控件

ddl.DataSource=ds.Tables["table1"]; 

    ddl.DataTextField="depname";  //下拉框的外观显示值
    ddl.DataValueField="depid"; 
//下拉框真值

ddl.DataBind();  //下拉框列表数据绑定完毕

    ddl.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"depid"))).Selected=true; 

//这句是精华中的精华:e.Item.DataItem取到当前记录的某字段值,然后据此,利用Items.FindByValue查找到列表中相符合的真值条目,然后将其选中

//依次来看,如果页面上记录列表中,如果有多个下拉框需要绑定,也可以实现,即参照da.Fill(ds, "table1")的方法,再多创建几个DataSet中的表

}


参考文献:http://blog.chinaunix.net/uid-9236609-id-3069178.html