如何在没有数据库的情况下从gridview中删除;在调用方法之前检查确定对象是否为空

how to delete from gridview without database "check to determine if the object is null before calling the method"

本文关键字:检查 方法 对象 是否 调用 删除 数据库 情况下 gridview      更新时间:2023-09-26

是我的。cs文件中的代码

private void BindGridview(int rowcount)
{
   DataTable dt = new DataTable();
   DataRow dr;
   dt.Columns.Add(new System.Data.DataColumn("Code", typeof(String)));
   dt.Columns.Add(new System.Data.DataColumn("Course", typeof(String)));
   dt.Columns.Add(new System.Data.DataColumn("Credit", typeof(String)));
   if (ViewState["CurrentData"] != null)
   {
      for (int i = 0; i < rowcount + 1; i++)
      {
         dt = (DataTable)ViewState["CurrentData"];
         if (dt.Rows.Count > 0)
         {
            dr = dt.NewRow();
            dr[0] = dt.Rows[0][0].ToString();
         }
      }
      dr = dt.NewRow();
      dr[0] = this.cboCourseCode.Text;
      dr[1] = this.txtCourseName.Text;
      dr[2] = this.txtCredit.Text;
      dt.Rows.Add(dr);
   }
   else
   {
      dr = dt.NewRow();
      dr[0] = this.cboCourseCode.Text;
      dr[1] = this.txtCourseName.Text;
      dr[2] = this.txtCredit.Text;
      dt.Rows.Add(dr);
   }
   // If ViewState has a data then use the value as the DataSource
   if (ViewState["CurrentData"] != null)
   {
      GridView1.DataSource = (DataTable)ViewState["CurrentData"];
      GridView1.DataBind();
   }
   else
   {
      // Bind GridView with the initial data assocaited in the DataTable
      GridView1.DataSource = dt;
      GridView1.DataBind();
   }
   // Store the DataTable in ViewState to retain the values
   ViewState["CurrentData"] = dt;
}
protected void BindGrid()
{
   GridView1.DataSource = ViewState["dt"] as DataTable;
   GridView1.DataBind();
}
protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e)
{
   int index = Convert.ToInt32(e.RowIndex);
   DataTable dt = ViewState["dt"] as DataTable;
   dt.Rows[e.RowIndex].Delete();
   ViewState["dt"] = dt;
   BindGrid();
}
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
      string Code = e.Row.Cells[0].Text;
      foreach (Button button in e.Row.Cells[3].Controls.OfType<Button>())
      {
         if (button.CommandName == "Delete")
         {
            button.Attributes["onclick"] = "if(!confirm('Do you want to delete " + Code + "?')){ return false; };";
         }
      }
   }   
}         
protected void cboCourseCode_SelectedIndexChanged(object sender, EventArgs e)
{
   this.Populate_Course_Details();
}
protected void BtnAdd_Click(object sender, EventArgs e)
{
   /*  DataTable dt = new DataTable();
   dt.Columns.AddRange(new DataColumn[3] { new DataColumn("Code"), new DataColumn("Course"), new DataColumn("Credit") });
   dt.Rows.Add(this.cboCourseCode.Text, this.txtCourseName.Text, this.txtCredit.Text);           
   ViewState["dt"] = dt;
   BindGrid();*/
   if (ViewState["CurrentData"] != null)
   {
      DataTable dt = (DataTable)ViewState["CurrentData"];
      int count = dt.Rows.Count;
      BindGridview(count);
   }
   else
   {
      BindGridview(1);
   }
}

我的aspx文件也有这个gridview

<asp:GridView ID="GridView1" CssClass = "Grid" runat="server" OnRowDeleting="OnRowDeleting" AutoGenerateColumns = "false" OnRowDataBound = "OnRowDataBound">
    <Columns>
        <asp:BoundField DataField="Code" HeaderText="Code" />
        <asp:BoundField DataField="Course" HeaderText="Course" />
        <asp:BoundField DataField="Credit" HeaderText="Credit" />
        <asp:CommandField ShowDeleteButton="True" ButtonType="Button" />
    </Columns>
</asp:GridView>

当我开始删除,我得到这个错误:

在调用

方法之前检查对象是否为空

错误原因

在OnRowDeleting函数中,你正在创建数据表并分配viewstate["dt"],它没有当前数据。这就是为什么它显示Object是Null

<<p> 解决方案/strong>

试试这个首先将其中一列作为数据键。考虑我想让"代码"列作为数据键。Datakey将帮助找到要删除的特定行

<asp:GridView ID="GridView1" CssClass = "Grid" runat="server"       OnRowDeleting="OnRowDeleting" AutoGenerateColumns = "false" OnRowDataBound = "OnRowDataBound" DataKeyNames="Code">

.cs代码

  • 用currentdata

  • 创建一个数据表
  • 使"Code"列为主键

  • 使用find()

  • 查找特定代码(您想要删除的代码)
  • 然后使用delete()函数删除该行

  • 反映viewsate["currentdata"]中的删除

  • 然后绑定gridview

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e)
{
    string code = GridView1.DataKeys[e.RowIndex].Value.ToString();
    if (ViewState["CurrentData"] != null)
    {
        DataTable dt = (DataTable)ViewState["CurrentData"];
         dt.PrimaryKey = new DataColumn[] { dt.Columns["Code"] };
        dt.Rows.Find(code).Delete();
        ViewState["CurrentData"] = dt;
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }                       
}