我将一个DataSet放到一个Session中,将Session中的一个表绑定到一个DataGrid中,在DataGrid中我加入了模板列。
DataSet表的示例:
当用户通过DataGrid模板列删除第一条记录后,此时数据并未保存到数据库中,只是在第一条记录中做了一个删除标记。但在DataGrid中用户看到的第一条记录已经没有了,模板列绑定的第一条记录实际上是DataSet中的第二条记录,当用户再次执行删除DataGrid中的第一条记录时,通过参数获得的仍然是已经删除的第一条记录的rownumber,所以执行后不会在DataGrid中删除。
具体代码如下:
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 窗体设计器生成的代码
![]()
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=# onclick='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;
}
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 窗体设计器生成的代码
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=# onclick='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;
}


浙公网安备 33010602011771号