关闭

DataGrid中以多列显示数据,并且对用户的点击改变其背景

738人阅读 评论(0) 收藏 举报
正常情况下,DataGrid的一行就是对应数据源中的一条记录!假如现在我的源数据表只有3个字段,能不能让我的DataGrid在一行中显示5条对应的记录呢?答案是肯定的!下面就来看看具体实现的方法。

假定源表中有三列,UserNM,UserID,Note。最终的DataGrid中分5列显示。

1、我们必须对源表进行转换,转换后的新表的一行就包括5条源表的记录:

private DataTable MakeDT(DataTable dt,int iCols)

////dt为待转换的源表,iCols为新表的一行包含源表的记录条数,本例为5

////转换后得到的新表的列名为从COL0开始,到COL(iCols*iColOfSrc-1)
{
int iColOfSrc = 3; ////源表待转换的列数
int ii,jj,kk,ll;
int iNewRows;
string strColNM = "";

DataTable newdt = new DataTable();
for(ii=0;ii<iCols*iColOfSrc;ii++)
{
strColNM = "COL"+ii.ToString();
newdt.Columns.Add(new DataColumn(strColNM,typeof(string)));
}
if(dt.Rows.Count == 0)
return newdt;
iNewRows = (dt.Rows.Count+iCols-1)/iCols;
kk = 0;
for(ii=0;ii<iNewRows;ii++)
{
DataRow dr = newdt.NewRow();
for(jj=0;jj<iCols;jj++)
{
kk = ii*iCols + jj;
if(kk<dt.Rows.Count)
{
ll = jj*iColOfSrc;
strColNM = "COL"+ll.ToString();
dr[strColNM] = dt.Rows[kk]["UserNM"];
ll = jj*iColOfSrc + 1;
strColNM = "COL"+ll.ToString();
dr[strColNM] = dt.Rows[kk]["UserID"];
ll = jj*iColOfSrc + 2;
strColNM = "COL"+ll.ToString();
dr[strColNM] = dt.Rows[kk]["Note"];
}
else
{
ll = jj*iColOfSrc;
strColNM = "COL"+ll.ToString();
dr[strColNM] = "";
ll = jj*iColOfSrc + 1;
strColNM = "COL"+ll.ToString();
dr[strColNM] = "";
ll = jj*iColOfSrc + 2;
strColNM = "COL"+ll.ToString();
dr[strColNM] = "";
}
}
newdt.Rows.Add(dr);
}
return newdt;
}


2、在DataGrid的Bind方法中,每次DataBind后须将所有单元格背景置为White:

////源数据表存放在ViewState["DS_UserInfo"]中,其ViewState为DataSet

void BindDataGrid()
{
if(ViewState["DS_UserInfo"] != null)
{
DataSet ds = new DataSet();
ds = (DataSet)ViewState["DS_UserInfo"];
DataTable dt = new DataTable();
dt = MakeDT(ds.Tables["tab_User"],5);////注意这里的参数5!   

this.DG_User.DataSource = dt.DefaultView;
this.DG_User.DataBind();

////以下代码将所有单元格背景置为white

int ii,jj;
for(ii=0;ii<this.DataGrid1.Items.Count;ii++)
{
if((this.DG_User.Items[ii].ItemType == ListItemType.Item)
||(this.DG_User.Items[ii].ItemType == ListItemType.AlternatingItem)
||(this.DG_User.Items[ii].ItemType == ListItemType.SelectedItem))
{
for(jj=0;jj<5;jj++)
{
this.DG_User.Items[ii].Cells[jj].BackColor = System.Drawing.Color.White;
}
}
}

}
}

3、在ItemCommand事件处理中:

private void DG_User_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int iClick = -1;
if(e.CommandName.CompareTo("COL0") == 0)
iClick = 0;
if(e.CommandName.CompareTo("COL3") == 0)
iClick = 1;
if(e.CommandName.CompareTo("COL6") == 0)
iClick = 2;
if(e.CommandName.CompareTo("COL9") == 0)
iClick = 3;
if(e.CommandName.CompareTo("COL12") == 0)
iClick = 4;

if(iClick == -1)
return;

this.DG_User.SelectedIndex = e.Item.ItemIndex;

int ii,jj;
for(ii=0;ii<this.DG_User.Items.Count;ii++)
{
if((this.DG_User.Items[ii].ItemType == ListItemType.Item)
||(this.DG_User.Items[ii].ItemType == ListItemType.AlternatingItem)
||(this.DG_User.Items[ii].ItemType == ListItemType.SelectedItem))
{
for(jj=0;jj<5;jj++)
{
this.DG_User.Items[ii].Cells[jj].BackColor = System.Drawing.Color.White;
}
}
}
e.Item.Cells[iClick*3].BackColor = System.Drawing.Color.MediumSpringGreen;
}


4、在ASPX文件中,DataGrid的第一列为绑定COL0的按钮列,其后紧跟COL0,COL1,COL2;以此类推,绑定其他各列数据。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4870次
    • 积分:82
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:1篇
    • 译文:0篇
    • 评论:4条
    文章存档
    最新评论