一个只读列、绑定列、模板列(动态下拉)、编辑列都有的DataGrid
来源:互联网 发布:java 参数 notnull 编辑:程序博客网 时间:2024/04/29 23:06
一、页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm12</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<table align="center" width="500">
<tr>
<td></td>
</tr>
<tr>
<td>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" Width="495px">
<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<Columns>
<!-- 只读绑定列,用于实现在编辑状态下不允许改动的数据(正式使用时先删除) -->
<asp:BoundColumn DataField="AffairID" ReadOnly="True" HeaderText="编号"/>
<!-- 常规绑定列,在编辑状态下显示为文本框(正式使用时先删除) -->
<asp:BoundColumn DataField="AffairContent" HeaderText="内容"/>
<!-- 只读隐藏绑定列,隐藏下拉列表中原始的数据(正式使用时先删除) -->
<asp:BoundColumn Visible="False" DataField="AffairState" ReadOnly="True" HeaderText="状态"/>
<!-- 模板列,用于实现在编辑状态下非文本框的其他编辑域(正式使用时先删除) -->
<asp:TemplateColumn HeaderText="状态">
<!-- 常态模板,非编辑状态下呈现的样子(正式使用时先删除) -->
<ItemTemplate>
<asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.AffairState") %>' />
</ItemTemplate>
<!-- 编辑态模板,编辑状态下呈现的样子(正式使用时先删除) -->
<EditItemTemplate>
<!-- 下拉列表,动态绑定(正式使用时先删除) -->
<asp:DropDownList id="cboState" runat="server" Width="100px" />
</EditItemTemplate>
</asp:TemplateColumn>
<!-- 编辑按钮列(正式使用时先删除) -->
<asp:EditCommandColumn ButtonType="PushButton" UpdateText="更新" CancelText="取消" EditText="编辑">
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:EditCommandColumn>
</Columns>
</asp:DataGrid></td>
</tr>
</table>
</form>
</body>
</HTML>
二、代码
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace WelShem
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
this.Bind();
}
}
/*
为了直接可试用,没有基于数据库。使用的是动态生成并用ViewState维持的数据
在实际使用时可改成从数据库中通过ADO.net获取
*/
private DataTable GetData()
{
if(!this.IsPostBack)
{
DataTable dt=new DataTable();
dt.Columns.Add("AffairID",typeof(String));
dt.Columns.Add("AffairContent",typeof(String));
dt.Columns.Add("AffairState",typeof(String));
for(int i=1;i<10;i++)
{
dt.Rows.Add(new object[]{"000"+i.ToString(),"待填事务","准备"});
}
this.ViewState["dt"]=dt;
}
return (DataTable)this.ViewState["dt"];
}
private void Bind()
{
DataTable dt=this.GetData();
dt.DefaultView.Sort=dt.Columns[0].ColumnName;
this.DataGrid1.DataSource=dt.DefaultView;
this.DataGrid1.DataBind();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DataGrid1.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_CancelCommand);
this.DataGrid1.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_EditCommand);
this.DataGrid1.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_UpdateCommand);
this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.DataGrid1.EditItemIndex=-1;
this.Bind();
}
private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.DataGrid1.EditItemIndex=e.Item.ItemIndex;
this.Bind();
/*
控制第二列编辑项的列宽
由于已重新绑定,而e.Item还指向原位置,在定位时不能再用e,Item
*/
((TextBox)this.DataGrid1.Items[e.Item.ItemIndex].Cells[1].Controls[0]).Width=80;
}
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
/*
只读列,可直接从对应单元格中取文本
格式:e.Item.Cells[i].Text i为列号
*/
string aID=e.Item.Cells[0].Text;
/*
常规绑定列,呈现的是文本框所以要从控件中取值
格式:((TextBox)e.Item.Cells[i].Controls[0]).Text i为列号
*/
string aContent=((TextBox)e.Item.Cells[1].Controls[0]).Text;
/*
模板列有中种模板,编辑时使用三种:标题模板、编辑模板、底边模板
要取的值在第二个控件中
格式:((编辑控件类型)e.Item.Cells[i].Controls[1]).对应属性 i为列号
*/
string aState=((DropDownList)e.Item.Cells[3].Controls[1]).SelectedItem.Text;
/*
修改数据库
*/
DataTable dt=(DataTable)this.ViewState["dt"];
dt.DefaultView.RowFilter="AffairID="+e.Item.Cells[0].Text;
if(dt.DefaultView.Count>0)
dt.DefaultView.Delete(0);
dt.DefaultView.RowFilter="";
dt.Rows.Add(new object[]{aID,aContent,aState});
this.DataGrid1.EditItemIndex=-1;
this.Bind();
}
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.EditItem)
{
ArrayList ay=new ArrayList();
ay.Add("准备");
ay.Add("启动");
ay.Add("进行中");
ay.Add("完工");
DropDownList cboList=(DropDownList)e.Item.Cells[3].Controls[1];
cboList.DataSource=ay;
cboList.DataBind();
cboList.Items.FindByText(e.Item.Cells[2].Text).Selected=true;
}
}
}
}
- 一个只读列、绑定列、模板列(动态下拉)、编辑列都有的DataGrid
- 动态创建DataGrid模版列,绑定列
- DataGrid 模板列数据绑定
- DataGrid后台绑定模板列
- DataGrid动态添加模板列
- datagrid模板列动态链接
- DataGrid动态添加模板列
- 如何在datagrid的模版编辑列里动态绑定了一个dropdownlist
- 如何取得DataGrid绑定列和模板列中的值
- 如何取得DataGrid绑定列和模板列中的值
- Datagrid编辑列值
- Easyui - datagrid 列编辑
- silverlight datagrid动态生成列&动态绑定
- datagrid 中编辑模板列的问题
- 动态生成datagrid的绑定列
- datagrid模板列
- DataGrid动态添加模板列的一个例子
- DataGrid动态添加模板列的一个例子
- 今天买了两本书
- 关于一些软件资料
- Acronym - 缩写词
- 编程之道-The Tao Of Programming(II)
- 面向对象的perl 2
- 一个只读列、绑定列、模板列(动态下拉)、编辑列都有的DataGrid
- 人际关系
- 解析#pragma指令(转载)
- C++中的预处理
- VB.NET多窗格用户界面
- [随文杂记]无题
- 目标
- 解压:众人解说如何收放自如 (转)
- 如何在C#里面象js一样可以直接计算字符串的值