天一剑客

首页 新随笔 联系 管理
我将一个DataSet放到一个Session中,将Session中的一个表绑定到一个DataGrid中,在DataGrid中我加入了模板列。
DataSet表的示例:
字段1 字段2 字段3 删除标记
ID1 姓名1 地址1 已经删除
ID2 姓名2 地址2
ID3 姓名3 地址3
当用户通过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;
  }
 
posted on 2005-12-24 23:35  天一剑客  阅读(474)  评论(0)    收藏  举报