DataGrid使用心得(附大量代码)
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中去,
<p 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();
}