1. 为 DataGrid 控件设计样式
  
  在<asp:datagrid id="DataGrid1" runat="server">之后添加如下代码
<FooterStyle ForeColor="Black" BackColor="#CCCCCC"></FooterStyle>
  
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#008A8C"></SelectedItemStyle>
  
<AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
  
<ItemStyle ForeColor="Black" BackColor="#EEEEEE"></ItemStyle>
  
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#000084"></HeaderStyle>
说明:
  (1) 在每个标签内主要是 ForeColor   BackColor Font-Bold 这几个属性值
  
  2. 为 DataGrid 控件添加绑定列
  
  <asp:BoundColumn DataField="" ReadOnly="True" HeaderText=""></asp:BoundColumn>
  说明:
  (1) 在标签内的基本属性是 DataField / HeaderText 
  (2) DataFormatString 用于 获取或设置指定列中各项的显示格式的字符串。
  形式为 { A: Bxx }。例如,格式化字符串 {0:F2} 将显示带两位小数的定点数。
  其中A值只能设置为 0,因为每个单元格中只有一个值。
  冒号后的字符(常规示例中为 B)指定值的显示格式
  C 以货币格式显示数值。 
    D 以十进制格式显示数值。 
    E 以科学记数法(指数)格式显示数值。 
    F 以固定格式显示数值。 
    G 以常规格式显示数值。 
    N 以数字格式显示数值。 
    X 以十六进制格式显示数值。 
  (3) Visible 获取或设置一个值,该值指示此列在 DataGrid 控件中是否可见。
  (4) ReadOnly 设置些列是否只读,若是只读的话,则不能修改.
  (5) SortExpression 获取或设置选择进行排序的列时传递到 OnSortCommand 方法的字段或表达式的名称。
  

3. 为 DataGrid 控件添加模板列
<asp:TemplateColumn HeaderText="类别">
  
<ItemTemplate>
    
<asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "actorclassname") %>' runat="server" ID="Label1"/>
  
</ItemTemplate>
  
<EditItemTemplate>
    
<select name="sltclassname">
    
<% = ActorClass.GetParentClass(0%>
    
</select>
  
</EditItemTemplate>
  
</asp:TemplateColumn>
说明:
  (1) 基本框架是
<asp:TemplateColumn HeaderText="类别">
  
<ItemTemplate></ItemTemplate>
  
</asp:TemplateColumn>
(2) 全面的模板列
<asp:TemplateColumn>

          
<HeaderTemplate>
            
<b> Tax </b>
          
</HeaderTemplate>

          
<ItemTemplate>
            
<asp:Label
              
Text='<%# DataBinder.Eval(Container.DataItem, "Tax") %>'
              runat="server"/>
          
</ItemTemplate>

          
<EditItemTemplate>

            
<asp:CheckBox
              
Text="Taxable" 
              runat
="server"/>

          
</EditItemTemplate>

          
<FooterTemplate>
            
<asp:HyperLink id="HyperLink1"
              Text
="Microsoft"
              NavigateUrl
="http://www.microsoft.com"
              runat
="server"/>
          
</FooterTemplate>

        
</asp:TemplateColumn>
(3) 为布尔型列应用模板列
<asp:TemplateColumn>
      
<ItemTemplate>
        
<asp:Label
            
Text='<%# DataBinder.Eval(Container.DataItem, "Tax") %>'
              runat="server"/>
        
</ItemTemplate>
        
<EditItemTemplate>
        
<asp:CheckBox
            
Text="Taxable" 
              runat
="server"/>

        
</EditItemTemplate>
    
</asp:TemplateColumn>
在正常状态,用 Label控件显示
    在编辑状态,用 CheckBox控件显示
  
(4) 为枚举类型列应用模板列,如业务地区(全网/广东/云南等等)
<asp:TemplateColumn HeaderText="处理方式">
  
<ItemTemplate>
  
<asp:Label ID="lbStatus">
  
<%# DataBinder.Eval(Container, "DataItem.DealWith"%>
  
</asp:Label>
  
</ItemTemplate>
  
<EditItemTemplate>
  
<asp:DropDownList id="dpStatus2" runat="server" DataTextField="status">
  
<asp:ListItem Value="Log">Log(日志)</asp:ListItem>
  
<asp:ListItem Value="SendSms">SendSms(短信)</asp:ListItem>
  
</asp:DropDownList>
  
</EditItemTemplate>
</asp:TemplateColumn>
在正常状态,用 Label控件显示
在编辑状态,用 DropDownList控件显示

(5) 为长字符串应用模板列,如一篇文章的内容
还未做过

4. 为 DataGrid 控件添加按钮列

<asp:ButtonColumn 
    HeaderText="Remove from cart" 
    ButtonType="PushButton" 
    Text="Remove" 
    CommandName="RemoveFromCart" />
  (1) 要使用按钮列,必须在 DataGrid 控件中添加 OnItemCommand 属性,并为该事件添加处理方法.
  (2) 模板列可以实现按钮列能实现的任何功能.
  
  5. 为 DataGrid 控件添加编辑列
  <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" HeaderText="编辑" CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
  (1) ButtonType 有两个值: LinkButton 超级链接样式按钮的列 | PushButton 普通按钮的列。 

6. 为 DataGrid 控件添加超链接列
<asp:HyperLinkColumn Text="添加子类" DataNavigateUrlField="ActorclassID" DataNavigateUrlFormatString="addActorClass.aspx?classID={0}"></asp:HyperLinkColumn>
(1) 为每一行设置相同的文字及跳转的URL地址
设置 Text 和 NavigateUrl 属性,则列中的所有超级链接将共享同一标题和 URL
(2) 为每一行设置不同的文字及不同跳转的URL地址
A. 用 DataTextField 设置数据源字段,若还想在原数据的基础上加工一下(如字段值为300,想显示为300元)
  则再设置 DataTextFormatString 字段
B. 用DataNavigateUrlField 及 DataNavigateUrlFormatString 来设置URL地址
  用DataTextField = "money" DataTextFormatString = "{0}元"
C. 举例
  DataNavigateUrlField="ActorclassID" DataNavigateUrlFormatString="addActorClass.aspx?classID={0}"
  
7. 为 DataGrid 控件添加"编辑"代码
在 DataGrid 标签中加入 
OnUpdateCommand="DataGrid1_Update" OnCancelCommand="DataGrid1_Cancel" OnEditCommand="DataGrid1_Edit"代码
在codeBehind页面加入如下代码
///响应编辑按钮
public void DataGrid1_Edit(Object sender, DataGridCommandEventArgs e) 
{
  DataGrid1.EditItemIndex 
= e.Item.ItemIndex;
  
if (Request.QueryString.Get("classID"!= null)
  Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
  Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by depth,orderID desc"));
}

  
///响应取消按钮
public void DataGrid1_Cancel(Object sender, DataGridCommandEventArgs e) 
{
  DataGrid1.EditItemIndex 
= -1;
  
if (Request.QueryString.Get("classID"!= null)
  Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
  Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by depth,orderID desc"));

}


///响应更新按钮   
public void DataGrid1_Update(Object sender, DataGridCommandEventArgs e) 
{
  TextBox ClassNameText 
= (TextBox)e.Item.Cells[1].Controls[0];
  
string className = ClassNameText.Text;
  
int classID = Int32.Parse((e.Item.Cells[0].Text).ToString());
  TextBox orderID2 
= (TextBox)e.Item.Cells[5].Controls[0];
  
int orderID = Int32.Parse(orderID2.Text);
  ActorClass.ModifyActorClass(className,classID,orderID);

  DataGrid1.EditItemIndex 
= -1;
  
if (Request.QueryString.Get("classID"!= null)
  Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
  Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by depth,orderID desc"));
}

说明
(1) DataGrid 事件处理程序的格式
  MethodName(Object sender, DataGridCommandEventArgs e) 
(2) 更新按钮的说明
  A. 获取编辑状态中的文本框
  TextBox ClassNameText = (TextBox)e.Item.Cells[1].Controls[0];
  string className = ClassNameText.Text;
  B. 获取编辑状态中的下拉列表框
  方法一
  int classID;
  classID = Int32.Parse(Request.Form.Get("sltclassname"));
  方法二
  DropDownList bbb = (DropDownList)e.Item.Cells[10].FindControl("dpStatus2");
  string ddpValue = bbb.SelectedValue
  C. 获取编辑状态中的复选框
  bool boolEnabled = ((CheckBox)e.Item.FindControl("chk_enabled")).Checked;
  String str2;
  if (boolEnabled)
  {
  str2="1";
  }
  else 
  {
  str2="0";
  }
  赋值给 str2 ,原因是插入到数据库的布尔型值只能是 1 或者 0
  D. 获取编辑状态中的文本值,即该列是只读的.
  string storyID = (e.Item.Cells[0].Text).ToString();

8. 为 DataGrid 控件添加分页事件
在 DataGrid 控件标签中加入如下代码
OnPageIndexChanged="DataGrid1_PageIndexChanged"
在后台中加入如下代码
/// <summary>
/// 响应分页事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

public void DataGrid1_Page(Object sender, DataGridPageChangedEventArgs e)
{
  DataGrid1.CurrentPageIndex 
= e.NewPageIndex;
  DataBind();
}
9. 为 DataGrid 控件添加绑定事件,即在 DataGrid绑定时发生的事件处理
一般用些事件来,做一些页面上的效果.如更改背景色,文本框大小等.
OnItemDataBound="DataGrid1_ItemDataBound"
/// <summary>
/// 响应DataGrid绑定事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

public void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
  
if (e.Item.ItemType == ListItemType.Item)
  
{
  e.Item.Attributes.Add(
"onmouseover","this.style.backgroundColor='#c8dafa'");
  e.Item.Attributes.Add(
"onmouseout","this.style.backgroundColor='white'");

  }

  
else if (e.Item.ItemType == ListItemType.AlternatingItem)
  
{
  e.Item.Attributes.Add(
"onmouseover","this.style.backgroundColor='#c8dafa'");
  e.Item.Attributes.Add(
"onmouseout","this.style.backgroundColor='#f6f6f6'");
  }

}

10. 为 DataGrid 控件添加接钮处理事件程序
在 DataGrid 控件标签中加入如下代码
OnItemCommand="ItemsGrid_Command"
在后台中加入如下代码
public void ItemsGrid_Command(Object sender, DataGridCommandEventArgs e)
{
  
switch(((LinkButton)e.CommandSource).CommandName)
  
{

  
case "Delete":
  
int classID = Int32.Parse((e.Item.Cells[0].Text).ToString());
  ActorClass.DeleteActorClass(classID);
  
if (Request.QueryString.Get("classID"!= null)
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by depth,orderID desc"));
  
break;

  
// Add other cases here, if there are multiple ButtonColumns in 
  
// the DataGrid control.
  case "hidden":
  
int actorID = Int32.Parse((e.Item.Cells[0].Text).ToString());
  ActorClass.HiddenActorClass(actorID);
  
if (Request.QueryString.Get("classID"!= null)
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by depth,orderID desc"));
  
break;
  
case "MoveUp":
  
int actorclassID = Int32.Parse((e.Item.Cells[0].Text).ToString());
  
string orderID = (e.Item.Cells[5].Text).ToString();
  ActorClass.MoveUp(orderID,actorclassID);
  
if (Request.QueryString.Get("classID"!= null)
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by depth,orderID desc"));
  
break;
  
case "MoveDown":
  actorclassID 
= Int32.Parse((e.Item.Cells[0].Text).ToString());
  orderID 
= (e.Item.Cells[5].Text).ToString();
  ActorClass.MoveDown(orderID,actorclassID);
  
if (Request.QueryString.Get("classID"!= null)
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where parentID=" + Request.QueryString.Get("classID"+ " order by depth,orderID desc"));
  
else
    Common.BindData(DataGrid1,Common.GetSource(
"select * from ActorClass where depth=1 order by orderID"));
  
break;
  

  
default:
  
// Do nothing.
  break;

  }

}

11. 为 DataGrid添加模板列,但是内容根据字段值来显示"链接",还是文本
以下三个都是,根据字段列不同,而显示内容及显示控件不同的处理代码.
<asp:TemplateColumn HeaderText="子菜单">
  
<ItemTemplate>
  
<%# ActorClassManage.hasLeaf(DataBinder.Eval(Container.DataItem,"ActorClassID").ToString(),DataBinder.Eval(Container.DataItem,"child").ToString())%>
  
</ItemTemplate>
</asp:TemplateColumn>
public static string hasLeaf(string id,string child)
{
  
string lRtn = "";
  
if (Int32.Parse(child) > 0)
  lRtn
="<a href='Actorclassmanage.aspx?classID="+id+"'><font color=blue>子菜单(" + child + ")</font></a>";
  
else
  lRtn 
= "无子菜单";

  
return lRtn;
}

<asp:TemplateColumn HeaderText="属性">
  
<ItemTemplate>
  
<asp:LinkButton Text='<%# IsHidden(DataBinder.Eval(Container.DataItem,"ActorClassID").ToString(),(bool)DataBinder.Eval(Container.DataItem,"Enabled")) %>' runat="server" CommandName="hidden" ID="Linkbutton1"></asp:LinkButton>
  
</ItemTemplate>
</asp:TemplateColumn>
public static string IsHidden(string id,bool enabled)
{
  
string lRtn = "";
  
if (enabled == true)
  
{
  lRtn 
= "[显示]";
  }

  
else
  
{
  lRtn 
= "隐藏";
  }

  
return lRtn;
}

public static void Sort(string actorclassID, string orderID)
{
  
string temp = "";
  
if (Int32.Parse(BgPicManage.GetMaxCode("actorclass","orderID")) == Int32.Parse(orderID))
  
{
  temp 
+= "<ipnut type='submit' value='向下移'>";
  }

  
if (Int32.Parse(orderID) == 0)
  
{
  temp 
+= "<ipnut type='submit' value='向上移'>";
  }

}

12. DataGrid 控件自定义分页代码

将下列代码放于包含<DataGrid>的form中去,
<style="FONT-SIZE:9pt" align="center">
      
<asp:label id="lblPageCount" runat="server"></asp:label> 
      
<asp:label id="lblCurrentIndex" runat="server"></asp:label>
      
<asp:linkbutton id="btnFirst" onclick="PagerButtonClick" runat="server" Font-Name="verdana"
      Font-size
="8pt" ForeColor="navy" CommandArgument="0"></asp:linkbutton> 
      
<asp:linkbutton id="btnPrev" onclick="PagerButtonClick" runat="server" Font-Name="verdana"
      Font-size
="8pt" ForeColor="navy" CommandArgument="prev"></asp:linkbutton> 
      
<asp:linkbutton id="btnNext" onclick="PagerButtonClick" runat="server" Font-Name="verdana"
      Font-size
="8pt" ForeColor="navy" CommandArgument="next"></asp:linkbutton> 
      
<asp:linkbutton id="btnLast" onclick="PagerButtonClick" runat="server" Font-Name="verdana"
      Font-size
="8pt" ForeColor="navy" CommandArgument="last"></asp:linkbutton>
    
</p>
后台代码
private void Page_Load(object sender, System.EventArgs e)
    
{
      
// 在此处放置用户代码以初始化页面
      btnFirst.Text = "最首页";
      btnPrev.Text 
= "前一页";
      btnNext.Text 
= "下一页";
      btnLast.Text 
= "最后页";
      
//绑定数据源
      if (!Page.IsPostBack)
      
{
      OpenDatabase();
      BindGrid();
      }

    }

    
    
//用于显示"第几页,总*页"
    private void ShowStats()
{
  lblCurrentIndex.Text 
= "第 " + (MyDataGrid.CurrentPageIndex + 1).ToString() + " 页";
  lblPageCount.Text 
= "总共 " + MyDataGrid.PageCount.ToString() + " 页";
}


//响应分页按钮
public void PagerButtonClick(object sender, EventArgs e)
    
{
      
string arg = ((LinkButton)sender).CommandArgument.ToString();
      
switch(arg)
      
{
        
case "next":
        
if (MyDataGrid.CurrentPageIndex < (MyDataGrid.PageCount - 1))
        
{
          MyDataGrid.CurrentPageIndex 
+= 1;
        }

        
break;
        
case "prev":
        
if (MyDataGrid.CurrentPageIndex > 0)
        
{
          MyDataGrid.CurrentPageIndex 
-= 1;
        }

        
break;
        
case "last":
        MyDataGrid.CurrentPageIndex 
= (MyDataGrid.PageCount - 1);
        
break;
        
default:
        MyDataGrid.CurrentPageIndex 
= System.Convert.ToInt32(arg);
        
break;
      }

      BindGrid();
      ShowStats();
    }

DataTable中数据记录的统计 
我们在使用Sql Server这些数据库时,可以轻松的通过Sum、Aver、Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Service获得了DataSet,这个时候,可是没有办法回头去修改Select语句来获取这些统计了。那么在DataSet/DataTable中是否可以进行统计呢?答案是肯定的。 
   
  本文介绍一个简单的方法,不需要逐条记录进行计算就可以轻松的获得DataTable中的记录统计结果。这个简单的方法就是调用功能强大的DataTable的函数Compute。 
   
  一、调用说明(仅以C#为例,下同): 
   
  public object Compute(string strExpression,string strFilter) 
   
  参数: 
   
  strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式 
   
  strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计 
   
  二、调用举例: 
   
  以下示例,假设一个产品销售表table,描述某商场中各促销员销售的实际记录,包含字段为:姓名(Name)、性别(Sex,0为女,1为男)、生日(Birthday)、销售产品的代码(ProID)、销售的数量(Quantity)、销售价格(Price)。 
   
  1.统计所有性别为女的销售员的数量: 
  table.Compute("Count(*)","Sex=0"); 
   
  2.统计所有销售员中年龄大于20岁的 
  table.Compute("Count(*)","Birthday<'"+today);//today为今天的日期字符串 
   
  3.统计销售产品的平均价格 
  table.Compute("Aver(Price)","true"); 
   
  4.统计产品代码为1的产品销售数量: 
  table.Compute("Sum(Quantity)","ProID=1"); 
   
  5.统计所有产品的销售总金额: 
  要统计总销售金额,由于table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如: 
  table.Compute("Sum(Quantity*Price)","true"); 
   
  这里一个问题是:DataTable的统计功能没有SqlServer强,这个统计是错误的,因为Compute的统计不具备Sum(Quantity*Price)这样数据的功能。那怎么办呢? 
   
  对于这样复杂数据的统计,我们可以在DataTable中创建一个新的字段来完成,比如Amount,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了: 
  table.Compute("Sum(Amount)","true");
posted on 2007-05-13 08:52  刺猬博客  阅读(191)  评论(0编辑  收藏  举报