.net之 datagrid

  (自己参加的这个项目中)数据绑定控件除了上节的repeater,另一个常用的就是datagrid了.预实现效果:

 

 一:用到的几个属性,概述.

(1)AutoGenerateColumns(是否自动生成列):默认情况下,属性被设置为 true,为数据源中的每一个字段创建一个列(BoundColumn)对象.列显示顺序与每一字段在数据源中出现的顺序一样。 通常情况下,将其设为false,而只选择你要显示的列,将其包含在<columns></columns>标记之间列,显示顺序与添加顺序一致。

(2)AlternatingItemStyle(交替项样式) :指定 控件中交替项的样式,为了美观,常把相邻两行定义为不同的样式.

(3)ItemStyle(项样式):指定控件中项的样式。

(4)HeaderStyle(头样式): 指定控件中页眉部分的样式。

(5)PagerStyle:指定控件中页选择部分的样式,可用于对所绑定数据分页,

(6)Columns:列集合,当自动生成列设为false时,添加自定义列.

(7)BoundColumn:显示绑定到数据源中的字段的列。它以文本形式显示字段中的每个项。这是 DataGrid 控件的默认列类型。

(8)TemplateColumn:按照指定的模板显示列中的各项。这使您可以在列中提供自定义控件。

(9)DataField:指定所绑定数据源对应的列名称

(10)HeaderText:指定头部显示名称

(11)Wrap:是否换行

(12)HorizontalAlign:水平停靠位置

二:datagrid用到的事件概述:

(1)先调用ItemCreated创建每一项,然后调用ItemDataBound绑定每一项数据,当点击一行时会调用Itemcommand事件.

所以若要对每一行中的空间添加属性,则应在ItemCreated中,若与所绑定的数据有关则在ItemDataBound中,为每一行的某些项添加CommandName则可以再ItemCommand中获取对应事件.

代码如下:

.aspx中代码:

代码
                <asp:datagrid id="DGItem" runat="server" Width="100%" PageSize="40" AutoGenerateColumns="False"
                            CssClass
="DataGrid" AllowPaging="True">
                            
<AlternatingItemStyle CssClass="DataGridAlter"></AlternatingItemStyle>
                            
<ItemStyle CssClass="DataGridItem"></ItemStyle>
                            
<HeaderStyle Wrap="False" CssClass="DataGridHeader"></HeaderStyle>
                            
<PagerStyle Visible="False"></PagerStyle>
                            
<Columns>
                                
<asp:BoundColumn Visible="False" DataField="newsId" HeaderText="newsId">
                                    
<HeaderStyle Wrap="False"></HeaderStyle>
                                
</asp:BoundColumn>
                                
<asp:TemplateColumn HeaderText="选择">
                                    
<HeaderStyle Wrap="False" HorizontalAlign="Center" Width="50px" VerticalAlign="Middle"></HeaderStyle>
                                    
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
                                    
<HeaderTemplate>
                                        
<asp:checkbox id="chkAll" runat="server" Text="删除"></asp:checkbox>
                                    
</HeaderTemplate>
                                    
<ItemTemplate>
                                        
<asp:checkbox id="chkSingle" runat="server"></asp:checkbox>
                                    
</ItemTemplate>
                                
</asp:TemplateColumn>
                                
<asp:BoundColumn DataField="newsTitle" HeaderText="名称">
                                    
<HeaderStyle Wrap="False"></HeaderStyle>
                                
</asp:BoundColumn>
                                
<asp:BoundColumn DataField="keywords" HeaderText="关键字">
                                    
<HeaderStyle Wrap="False"></HeaderStyle>
                                
</asp:BoundColumn>
                                
<asp:TemplateColumn HeaderText="来源">
                                    
<ItemTemplate>
                                        
<asp:Label id="Label1" runat="server" Text="dd"></asp:Label>
                                    
</ItemTemplate>
                                
</asp:TemplateColumn>
                                
<asp:BoundColumn DataField="inDate" HeaderText="添加日期" DataFormatString="{0:yyyy-MM-dd}">
                                    
<HeaderStyle Wrap="False" Width="70px"></HeaderStyle>
                                    
<ItemStyle HorizontalAlign="Center"></ItemStyle>
                                
</asp:BoundColumn>
                                
<asp:BoundColumn DataField="editDate" HeaderText="修改日期" DataFormatString="{0:yyyy-MM-dd}">
                                    
<HeaderStyle Wrap="False" Width="70px"></HeaderStyle>
                                    
<ItemStyle HorizontalAlign="Center"></ItemStyle>
                                
</asp:BoundColumn>
                                
<asp:BoundColumn DataField="hits" HeaderText="点击率">
                                    
<HeaderStyle Wrap="False" Width="40px"></HeaderStyle>
                                    
<ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
                                
</asp:BoundColumn>
                                
<asp:BoundColumn DataField="orderNo" HeaderText="序号">
                                    
<HeaderStyle Wrap="False" Width="40px"></HeaderStyle>
                                    
<ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
                                
</asp:BoundColumn>
                                
<asp:TemplateColumn HeaderText="审核">
                                    
<HeaderStyle Wrap="False" Width="55px"></HeaderStyle>
                                    
<ItemStyle HorizontalAlign="Center"></ItemStyle>
                                    
<ItemTemplate>
                                        
<asp:CheckBox id=cbIsPass runat="server" Text="通过" OnCheckedChanged="CheckBox_CheckedChanged" AutoPostBack="True" Checked='<%# DataBinder.Eval(Container, "DataItem.isPass") %>' >
                                        
</asp:CheckBox>
                                    
</ItemTemplate>
                                
</asp:TemplateColumn>
                                
<asp:TemplateColumn HeaderText="设置">
                                    
<HeaderStyle Wrap="False" Width="120px"></HeaderStyle>
                                    
<ItemStyle HorizontalAlign="Center"></ItemStyle>
                                    
<ItemTemplate>
                                        
<cc1:userlinkbutton id="btnCommand" runat="server" ToolTip="推荐本新闻" CommandName="command">[我要推荐]</cc1:userlinkbutton>&nbsp;&nbsp;
                                        
<cc1:userlinkbutton id="btnRemark" runat="server" ToolTip="管理评论" CommandName="remark">[评论]</cc1:userlinkbutton>&nbsp;&nbsp;
                                        
<cc1:userimagebutton id="imgButtonEdit" runat="server" ToolTip="修改" CommandName="Edit" ImageAlign="AbsMiddle"
                                            ImageUrl
="../Images/edit.gif"></cc1:userimagebutton>
                                    
</ItemTemplate>
                                
</asp:TemplateColumn>
                                
<asp:BoundColumn Visible="False" DataField="isPic" HeaderText="isPic"></asp:BoundColumn>
                                
<asp:BoundColumn Visible="False" DataField="picUrl" HeaderText="picUrl"></asp:BoundColumn>
                                
<asp:BoundColumn Visible="False" DataField="isCommand" HeaderText="isCommand"></asp:BoundColumn>
                            
</Columns>
                        
</asp:datagrid>

aspx.cs中代码:

在ItemCreated中为每一行的checkbox添加点击事件(调用js)

代码
        /// <summary>
        
/// 创建datagrid时,,为checkbox添加js事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void DGItem_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
            
if(e.Item.ItemType == ListItemType.Header)
            {
                ((CheckBox)e.Item.Cells[
1].FindControl("chkAll")).Attributes.Add("onclick","CheckAll('" + this.DGItem.ClientID.ToString() + "','chkAll','chkSingle');");
            }    
            
if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
            {
                ((CheckBox)e.Item.Cells[
1].FindControl("chkSingle")).Attributes.Add("onclick","CheckSingle('" + this.DGItem.ClientID.ToString() + "','chkAll','chkSingle');");
            }
            
        }

在ItemDataBound中为需要根据数据源显示的项进行判断(如若对应新闻项目已推荐,则显示取消推荐,否则显示我要推荐)

代码
        /// <summary>
        
/// 绑定数据时调用事件,设置是否推荐
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void DGItem_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
            
if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
            {
                
bool command = System.Boolean.Parse(e.Item.Cells[13].Text.ToString());
                
if(command)
                {
                    ((LinkButton) e.Item.FindControl(
"btnCommand")).Text="[取消推荐]";
                }
                
else
                {
                    ((LinkButton) e.Item.FindControl(
"btnCommand")).Text="[我要推荐]" ;
                }
            }
        }

根据aspx中设置的CommanName在ItemCommand事件中判断下一步的操作(推荐,评论还是修改?)

代码
        /// <summary>
        
/// 检测(评论,推荐,编辑事件 )
        
/// </summary>
        
/// <param name="source"></param>
        
/// <param name="e"></param>
        private void DGItem_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            e.Item.Cells[
0].Text.ToString();
            
//this.Response.Write(e.CommandArgument+" name: "+e.CommandName+ e.Item.Cells[0].Text.ToString());    
            string command =""+ e.CommandName;
            
string strId = ""+ e.Item.Cells[0].Text.ToString();
            
int newsId =System.Int32.Parse(strId);
            tNewsFac 
= new DevSec.DH.Ums.DH.Fac.DCtNews();
            
if(command.Equals("command"))
            {
                
string str =((LinkButton) e.Item.FindControl("btnCommand")).Text.ToString() ;
                
if(str.Equals("[我要推荐]"))
                {
                
                    
//如果设为推荐
                    tNewsFac.SetCommand(newsId,1);
                    ((LinkButton) e.Item.FindControl(
"btnCommand")).Text="[取消推荐]" ;
                }
                
else
                {
                    
//取消推荐
                    tNewsFac.SetCommand(newsId,0);
                    ((LinkButton) e.Item.FindControl(
"btnCommand")).Text="[我要推荐]" ;
                }
            }
            
else if(command.Equals("remark"))
            {
                
this.Response.Redirect("remark.aspx?newsId="+newsId);
            }
            
else if(command.Equals("Edit"))
            {
                
this.Response.Redirect("schoolAddEdit.aspx?action=edit&newsId="+newsId);
            }
        }

也可以为datagrid上的checkbox绑定后台事件(如对于通过列)

aspx中为:

代码
                                <asp:TemplateColumn HeaderText="审核">
                                    
<HeaderStyle Wrap="False" Width="55px"></HeaderStyle>
                                    
<ItemStyle HorizontalAlign="Center"></ItemStyle>
                                    
<ItemTemplate>
                                        
<asp:CheckBox id=cbIsPass runat="server" Text="通过" OnCheckedChanged="CheckBox_CheckedChanged" AutoPostBack="True" Checked='<%# DataBinder.Eval(Container, "DataItem.isPass") %>' >
                                        
</asp:CheckBox>
                                    
</ItemTemplate>
                                
</asp:TemplateColumn>

.aspx.cs

代码
/// <summary>
        
/// 设置是否通过
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        public void CheckBox_CheckedChanged(object sender, System.EventArgs e)
        {
            
for(int index=0;index<this.DGItem.Items.Count;index++)
            {
                CheckBox MyCheckBox   
=   (CheckBox)DGItem.Items[index].FindControl("cbIsPass");   
                
if(sender.Equals(MyCheckBox))
                {
                    
int    newsId = System.Int32.Parse(DGItem.Items[index].Cells[0].Text.ToString());
                    tNewsFac 
= new DevSec.DH.Ums.DH.Fac.DCtNews();
                    tNewsFac.SetPass(newsId);
                }
            }
            
//绑定数据
            this.bindData(where);
        }

当然还需要定义该控件,且在页面初次调用时绑定数据源(略)

  protected System.Web.UI.WebControls.DataGrid DGItem; 

    this.DGItem.DataSource = dt;
    this.DGItem.DataBind();       
 其中js代码(实现全选以及单选):

代码
/* 分页
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    
    使用方法:
    if(e.Item.ItemType == ListItemType.Header)
    {
        ((CheckBox)e.Item.Cells[1].FindControl("chkAll")).Attributes.Add("onclick","CheckAll('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');");
    }
*/
function CheckAll(prefix,chkAll,chkSingle)
{
    
var indexChkAll;
    
if(prefix.length != 0)
    {
        indexChkAll        
= prefix + "__ctl2_" + chkAll;
    }
    
else
    {
        indexChkAll        
= chkAll;
    }
    
var objChkAll = document.getElementById(indexChkAll);
    
var tempObj;
    
for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj 
= document.forms[0].elements[i];
        
if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            tempObj.checked 
= objChkAll.checked;
        }
    }
}
/* 分页
    参数说明:
    prefix:前缀;chkAll:全选框;chkSingle:单选框ID
    
    使用方法:
    if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        ((CheckBox)e.Item.Cells[1].FindControl("chkSingle")).Attributes.Add("onclick","CheckSingle('" + this.dg.ClientID.ToString() + "','chkAll','chkSingle');");
    }
*/
function CheckSingle(prefix,chkAll,chkSingle)
{
    
var indexChkAll;
    
if(prefix.length != 0)
    {
        indexChkAll        
= prefix + "__ctl2_" + chkAll;
    }
    
else
    {
        indexChkAll        
= chkAll;
    }
    
var objChkAll = document.getElementById(indexChkAll);
    
var tempObj;
    
var allCount    = 0;
    
var checkCount    = 0;
    
for(var i=0;i<document.forms[0].elements.length;i++)
    {    
        tempObj 
= document.forms[0].elements[i];
        
if(tempObj.type == "checkbox" && tempObj.id != indexChkAll && tempObj.id.indexOf(chkSingle) != -1)
        {
            
if(tempObj.checked)
            {
                checkCount
++;
            }
            
else
            {
                objChkAll.checked 
= false;
                
//break;
            }
            allCount
++;
        }
    }
    
if(checkCount != allCount)
    {
        objChkAll.checked 
= false;
    }
    
else
    {
        
if(allCount != 0)
        {
            objChkAll.checked 
= true;
        }
    }
}


 

 

 

 

 

 

 

posted @ 2009-12-22 11:24  9421  阅读(1655)  评论(0编辑  收藏  举报