【问题标题】:Unable to clear viewstate无法清除视图状态
【发布时间】:2013-04-01 17:26:17
【问题描述】:

大家好,我正在为某些操作(例如在每个按钮上)分配视图状态的数据表,我将分配一行并将其绑定到数据表并将该数据表分配给视图状态。我有一个与我正在创建的数据表绑定的网格视图。因为我在删除行时有一个删除选项,所以我清除了 Viewstate 并为其分配了新的数据表

DataTable dtPayment = new DataTable();

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
   }
 }

protected void btn_Click(object sender, EventArgs e)
{
  if (ViewState["CurrentTable"] == null)
  {
    dtPayment.Columns.Add("Id", typeof(string));
    dtPayment.Columns.Add("PaymentMode", typeof(string));
    dtPayment.Columns.Add("TransactionAmount", typeof(string));
    dtPayment.Columns.Add("BankCharges", typeof(string));
    dtPayment.Columns.Add("Particulars", typeof(string));

     DataRow dr = dtPayment.NewRow();
     dr["Id"] = 1;
     dr["PaymentMode"] = "Cheque";
     dr["TransactionAmount"] = txtAmount.Text;
     dr["BankCharges"] = "";
     dr["Particulars"] = "";
     dtPayment.Rows.Add(dr);
     ViewState["CurrentTable"] = dtPayment;
     grd.DataSource = dtPayment;
     grd.DataBind();
  }
 else
 {
    AddNewRowToGrid("Cheque", txtAmount.Text);
 }

}

protected void grd_Deleting(object sender, DeletingEventArgs e)
{
   dt = (DataTable)ViewState["CurrentTable"];
   int iIndex;
   iIndex = grd.FocusedRowIndex;
   dt.Rows[iIndex].Delete();
   dt.AcceptChanges();
   ViewState.Remove("CurrentTable");
   ViewState["CurrentTable"] = dt;
   grd.DataSource = dt;
   grd.DataBind();
}

 protected void AddNewRowToGrid(string strPaymntMode, string transAmount)
    {
        int rowIndex = 0;
        //SetPreviousData();
        if (ViewState["CurrentTable"] != null)
        {
            DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
            DataRow drCurrentRow = null;
            if (dtCurrentTable.Rows.Count > 0)
            {
                for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                {
                    drCurrentRow = dtCurrentTable.NewRow();
                    drCurrentRow["Id"] = i + 1;
                    drCurrentRow["PaymentMode"] = strPaymntMode;
                    drCurrentRow["TransactionAmount"] = transAmount;
                    drCurrentRow["BankCharges"] = "";
                    drCurrentRow["Particulars"] = "";
                    rowIndex++;
                }
                dtCurrentTable.Rows.Add(drCurrentRow);
                ViewState["CurrentTable"] = dtCurrentTable;
                grd.DataSource = dtCurrentTable;
                grd.DataBind();
            }
        }

    }

但是在删除后查看它时,数据表仍然与具有先前值的数据表相同,有人可以告诉我哪里出错了

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    datatable 删除行后,您必须再次绑定grid。还要确保如果您在 page_load 中绑定了 gridview,那么它在 if(!Page.IsPostBack) 中。

    protected void grd_Deleting(object sender, DeletingEventArgs e)
    {
       dt = (DataTable)ViewState["CurrentTable"];
       int iIndex;
       iIndex = grd.FocusedRowIndex;
       dt.Rows[iIndex].Delete();
       dt.AcceptChanges();
       ViewState.Remove("CurrentTable");
       ViewState["CurrentTable"] = dt;
       //You have to bind the grid with new data table.
       GridView1.DataSource =  dt;
       GridView1.DataBind();
    }
    

    【讨论】:

    • 是的,我为第一条记录这样做它工作正常,但在删除第二条记录时,以前的值保留在视图状态中
    • 检查您是否没有在 page_load 上绑定数据表,这是否覆盖了您在 grd_Deleting 事件中所做的更改。
    • 在 page_load 中我没有绑定网格,在按钮单击事件中我通过检查视图状态和所有绑定了网格视图
    • 像这样检查我的编辑我将在每个按钮单击时有几个按钮我将检查视图状态是否为 null 如果为 null 我将创建新的否则我将添加一行
    • 我认为 dtCurrentTable.Rows.Add(drCurrentRow);在 AddNewRowToGrid 方法中将是循环的最后一条语句?
    【解决方案2】:

    在页面加载事件中检查 !isPostBack 内的 gridview 绑定方法调用??

    见下文

    void page_load()
    {
    if(!IsPostBack)    
    {
    // call Bind grid method
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多