DataSet表的示例:
字段1 | 字段2 | 字段3 | 删除标记 |
ID1 | 姓名1 | 地址1 | 已经删除 |
ID2 | 姓名2 | 地址2 | |
ID3 | 姓名3 | 地址3 |
具体代码如下:
namespace
Human.WebUI.Persons.modules
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Human.Common.Data;
/**//// <summary>
/// ExperienceListModule 的摘要说明。
/// </summary>
public class ExperienceListModule : ModuleBase
{
protected System.Web.UI.WebControls.DataGrid ExperienceDataGrid;
private void Page_Load(object sender, System.EventArgs e)
{
InitializeDataGrid();
ExperienceDataGrid.DataSource=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE].DefaultView;
ExperienceDataGrid.DataBind();
}
private void InitializeDataGrid()
{
ExperienceDataGrid.AutoGenerateColumns=false;
TemplateColumn tcStartYear=new TemplateColumn();
tcStartYear.HeaderTemplate=new DataGridTempleteColumn(ListItemType.Header,"开始时间");
tcStartYear.ItemTemplate=new DataGridTempleteColumn(ListItemType.Item,"StartYear");
ExperienceDataGrid.Columns.Add(tcStartYear);
TemplateColumn tcEndYear=new TemplateColumn();
tcEndYear.HeaderTemplate=new DataGridTempleteColumn(ListItemType.Header,"结束时间");
tcEndYear.ItemTemplate=new DataGridTempleteColumn(ListItemType.Item,"EndYear");
ExperienceDataGrid.Columns.Add(tcEndYear);
BoundColumn CorporationCol=new BoundColumn();
CorporationCol.HeaderText="单位名称";
CorporationCol.DataField=PersonData.EXPERIENCE_CORPORATION_FIELD;
ExperienceDataGrid.Columns.Add(CorporationCol);
BoundColumn DepartmentCol=new BoundColumn();
DepartmentCol.HeaderText="部门名称";
DepartmentCol.DataField=PersonData.EXPERIENCE_DEPARTMENT_FIELD;
ExperienceDataGrid.Columns.Add(DepartmentCol);
TemplateColumn tcEdit=new TemplateColumn();
tcEdit.HeaderTemplate=new DataGridTempleteColumn(ListItemType.Header,"修改");
tcEdit.ItemTemplate=new DataGridTempleteColumn(ListItemType.Item,"Edit");
ExperienceDataGrid.Columns.Add(tcEdit);
ButtonColumn tcDelete=new ButtonColumn();
tcDelete.Text="删除";
tcDelete.ButtonType=ButtonColumnType.LinkButton;
tcDelete.HeaderText="删除";
tcDelete.CommandName="Delete";
ExperienceDataGrid.Columns.Add(tcDelete);
}
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.ExperienceDataGrid.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.ExperienceDataGrid_DeleteCommand);
this.ExperienceDataGrid.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.ExperienceDataGrid_ItemDataBound);
this.ExperienceDataGrid.SelectedIndexChanged += new System.EventHandler(this.ExperienceDataGrid_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void ExperienceDataGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if (((LinkButton)e.CommandSource).CommandName == "Delete")
{
try
{
DataTable ExperienceTable=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE];
DataRow row=ExperienceTable.Rows[e.Item.ItemIndex];
row.Delete();
}
catch(Exception ex)
{
string s=ex.Message.ToString();
}
}
}
private void ExperienceDataGrid_SelectedIndexChanged(object sender, System.EventArgs e)
{
}
private void ExperienceDataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if((e.Item.ItemType!= ListItemType.Header) & ( e.Item.ItemType != ListItemType.Footer))
{
LinkButton oDeleteButton = (LinkButton)e.Item.Cells[5].Controls[0];
oDeleteButton.Attributes.Add("onclick","Javascript:return confirm('您是否确认要删除此记录?');");
}
}
}
class DataGridTempleteColumn:ITemplate
{
ListItemType templateType;
string columnName;
public DataGridTempleteColumn(ListItemType type, string colname)
{
templateType = type;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
Literal lc = new Literal();
switch(templateType)
{
case ListItemType.Header:
lc.Text = columnName;
container.Controls.Add(lc);
break;
case ListItemType.Item:
lc.DataBinding+=new EventHandler(TemplateControl_DataBinding);
container.Controls.Add(lc);
break;
case ListItemType.EditItem:
TextBox tb = new TextBox();
tb.Text = "";
container.Controls.Add(tb);
break;
case ListItemType.Footer:
lc.Text = "<I>" + columnName + "</I>";
container.Controls.Add(lc);
break;
}
}
private void TemplateControl_DataBinding(object sender,
System.EventArgs e)
{
Literal lc;
lc = (Literal) sender;
DataGridItem container=(DataGridItem)lc.NamingContainer;
if(columnName=="StartYear")
{
lc.Text+=DataBinder.Eval(container.DataItem, "StartYear");
lc.Text+="年";
lc.Text+=DataBinder.Eval(container.DataItem, "StartMonth");
lc.Text+="月";
}
if(columnName=="EndYear")
{
if(Convert.ToString(DataBinder.Eval(container.DataItem, "EndYear"))!="")
{
lc.Text+=DataBinder.Eval(container.DataItem, "EndYear");
lc.Text+="年";
lc.Text+=DataBinder.Eval(container.DataItem, "EndMonth");
lc.Text+="月";
}
else
{
lc.Text+="至今";
}
}
if(columnName=="Edit")
{
lc.Text+="<a href=# οnclick='EditExperience("+container.DataSetIndex+")'>修改</a>";
}
}
}
}
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Human.Common.Data;
/**//// <summary>
/// ExperienceListModule 的摘要说明。
/// </summary>
public class ExperienceListModule : ModuleBase
{
protected System.Web.UI.WebControls.DataGrid ExperienceDataGrid;
private void Page_Load(object sender, System.EventArgs e)
{
InitializeDataGrid();
ExperienceDataGrid.DataSource=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE].DefaultView;
ExperienceDataGrid.DataBind();
}
private void InitializeDataGrid()
{
ExperienceDataGrid.AutoGenerateColumns=false;
TemplateColumn tcStartYear=new TemplateColumn();
tcStartYear.HeaderTemplate=new DataGridTempleteColumn(ListItemType.Header,"开始时间");
tcStartYear.ItemTemplate=new DataGridTempleteColumn(ListItemType.Item,"StartYear");
ExperienceDataGrid.Columns.Add(tcStartYear);
TemplateColumn tcEndYear=new TemplateColumn();
tcEndYear.HeaderTemplate=new DataGridTempleteColumn(ListItemType.Header,"结束时间");
tcEndYear.ItemTemplate=new DataGridTempleteColumn(ListItemType.Item,"EndYear");
ExperienceDataGrid.Columns.Add(tcEndYear);
BoundColumn CorporationCol=new BoundColumn();
CorporationCol.HeaderText="单位名称";
CorporationCol.DataField=PersonData.EXPERIENCE_CORPORATION_FIELD;
ExperienceDataGrid.Columns.Add(CorporationCol);
BoundColumn DepartmentCol=new BoundColumn();
DepartmentCol.HeaderText="部门名称";
DepartmentCol.DataField=PersonData.EXPERIENCE_DEPARTMENT_FIELD;
ExperienceDataGrid.Columns.Add(DepartmentCol);
TemplateColumn tcEdit=new TemplateColumn();
tcEdit.HeaderTemplate=new DataGridTempleteColumn(ListItemType.Header,"修改");
tcEdit.ItemTemplate=new DataGridTempleteColumn(ListItemType.Item,"Edit");
ExperienceDataGrid.Columns.Add(tcEdit);
ButtonColumn tcDelete=new ButtonColumn();
tcDelete.Text="删除";
tcDelete.ButtonType=ButtonColumnType.LinkButton;
tcDelete.HeaderText="删除";
tcDelete.CommandName="Delete";
ExperienceDataGrid.Columns.Add(tcDelete);
}
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.ExperienceDataGrid.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.ExperienceDataGrid_DeleteCommand);
this.ExperienceDataGrid.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.ExperienceDataGrid_ItemDataBound);
this.ExperienceDataGrid.SelectedIndexChanged += new System.EventHandler(this.ExperienceDataGrid_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void ExperienceDataGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if (((LinkButton)e.CommandSource).CommandName == "Delete")
{
try
{
DataTable ExperienceTable=Person.Tables[PersonData.EXPERIENCE_ITEM_TABLE];
DataRow row=ExperienceTable.Rows[e.Item.ItemIndex];
row.Delete();
}
catch(Exception ex)
{
string s=ex.Message.ToString();
}
}
}
private void ExperienceDataGrid_SelectedIndexChanged(object sender, System.EventArgs e)
{
}
private void ExperienceDataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if((e.Item.ItemType!= ListItemType.Header) & ( e.Item.ItemType != ListItemType.Footer))
{
LinkButton oDeleteButton = (LinkButton)e.Item.Cells[5].Controls[0];
oDeleteButton.Attributes.Add("onclick","Javascript:return confirm('您是否确认要删除此记录?');");
}
}
}
class DataGridTempleteColumn:ITemplate
{
ListItemType templateType;
string columnName;
public DataGridTempleteColumn(ListItemType type, string colname)
{
templateType = type;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
Literal lc = new Literal();
switch(templateType)
{
case ListItemType.Header:
lc.Text = columnName;
container.Controls.Add(lc);
break;
case ListItemType.Item:
lc.DataBinding+=new EventHandler(TemplateControl_DataBinding);
container.Controls.Add(lc);
break;
case ListItemType.EditItem:
TextBox tb = new TextBox();
tb.Text = "";
container.Controls.Add(tb);
break;
case ListItemType.Footer:
lc.Text = "<I>" + columnName + "</I>";
container.Controls.Add(lc);
break;
}
}
private void TemplateControl_DataBinding(object sender,
System.EventArgs e)
{
Literal lc;
lc = (Literal) sender;
DataGridItem container=(DataGridItem)lc.NamingContainer;
if(columnName=="StartYear")
{
lc.Text+=DataBinder.Eval(container.DataItem, "StartYear");
lc.Text+="年";
lc.Text+=DataBinder.Eval(container.DataItem, "StartMonth");
lc.Text+="月";
}
if(columnName=="EndYear")
{
if(Convert.ToString(DataBinder.Eval(container.DataItem, "EndYear"))!="")
{
lc.Text+=DataBinder.Eval(container.DataItem, "EndYear");
lc.Text+="年";
lc.Text+=DataBinder.Eval(container.DataItem, "EndMonth");
lc.Text+="月";
}
else
{
lc.Text+="至今";
}
}
if(columnName=="Edit")
{
lc.Text+="<a href=# οnclick='EditExperience("+container.DataSetIndex+")'>修改</a>";
}
}
}
}
问题终于解决了,由于我是使用Row.Delete()函数,数据并未从数据集中删除,只是做了一个删除标记,所以在提取数据时,需要计算DataGrid中要删除行中数据在DataSet中具体是对应的那条。函数如下:
private
int
GetFactRowItem(DataTable table,
int
ItemIndex)
{
int FactRowItem=0;
int UnDeleteRowCount=-1;
while(UnDeleteRowCount<ItemIndex)
{
if(table.Rows[FactRowItem].RowState==DataRowState.Deleted)
{
FactRowItem++;
}
else
{
FactRowItem++;
UnDeleteRowCount++;
}
}
return FactRowItem-1;
}
{
int FactRowItem=0;
int UnDeleteRowCount=-1;
while(UnDeleteRowCount<ItemIndex)
{
if(table.Rows[FactRowItem].RowState==DataRowState.Deleted)
{
FactRowItem++;
}
else
{
FactRowItem++;
UnDeleteRowCount++;
}
}
return FactRowItem-1;
}