0

我有一个 GridView,其中包含单击按钮时从两个 TextBox 中提取的数据。我希望在 Gridview 中实现以下功能: 1) 我希望能够编辑此 GridView 中的数据。2)我也应该能够从 GridView 中删除行。3) 最后,当我单击另一个提交按钮时,Gridview 中的所有行都应保存在数据库中。

它是一个使用 C# (Visual Studio 2010) 编码的基于 Web 的 ASP.NET 应用程序,并使用 SQL Server 2005。如何更改以下代码以实现上述指定功能?

public partial class _Default : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["constring"]);
    SqlCommand cmd = new SqlCommand();
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter();
    DataTable dt = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {      
        if (IsPostBack)
        {
            dt = Session["data_table"] as DataTable;
        }
    }

    protected void btnTextDisplay_Click(object sender, EventArgs e)
    {      
        if (dt == null)
        {
            dt = new DataTable();
            DataColumn dc1 = new DataColumn("Name");
            DataColumn dc2 = new DataColumn("City");
            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);

            Session["data_table"] = dt;
        }

        DataRow dr = dt.NewRow();
        dr[0] = txtName.Text;
        dr[1] = txtCity.Text;
        dt.Rows.Add(dr);
        gvDisplay.DataSource = dt;
        gvDisplay.DataBind();
    }

    protected void btnDisplay_Click(object sender, EventArgs e)
    {
        ds.Clear();
        da = new SqlDataAdapter("insert into PRACT values(@name, @city)", con);
        con.Open();
        da.Fill(ds);
        gv.DataSource = ds;
        gv.DataBind();
        con.Close();        
    }   
}
4

1 回答 1

0

好吧,在您的 aspx 页面上,我建议您这样做:

<asp:GridView runat="server" id="gvDisplay" OnRowCommand="grid_OnRowCommand">
  <Columns>
  <TemplateField>
    <ItemTemplate>
      <asp:TextBox runat="server" id="txtNameGrid" Text='<%#DataBinder.Eval(Container.DataItem, "Name")%>'/>
    </ItemTemplate>
  </TemplateField>
  <TemplateField>
    <ItemTemplate>
      <asp:TextBox runat="server" id="txtCityGrid" Text='<%#DataBinder.Eval(Container.DataItem, "City")%>'/>
    </ItemTemplate>
  </TemplateField>
  <TemplateField>
    <ItemTemplate>
      <asp:Button runat="server" id="btnDeleteGrid" Text = "Delete" CommandArgument='<%#Eval(Container.DataItem, "YourIDColumn")%>' CommandName="DeleteRow"/>
    </ItemTemplate>
  </TemplateField>
</Columns>
</asp:GridView>

我建议您在 DataTable 中创建一个新列,该列将是每个寄存器的 ID。

好吧,您在页面上将寄存器添加到此 DataTable,因此您需要创建一个 int 类型的会话,并且每次调用事件 btnTextDisplay_Click 时,您必须增加此 int Session 并将其值设置为 DataTable 的列 ID。

网格的属性 OnRowCommand 是当您单击按钮 btnDeleteGrid 时将调用的事件。此事件的代码如下:

protected void grid_OnRowCommand(object sender, GridViewCommandEventArgs e)
{
   if(e.CommandName == "DeleteRow")
   {
      foreach(DataRow row in dt.Rows)
      {
         if(Convert.ToInt32(row["YourColumnID"]) == Convert.ToInt32(e.CommandArgument))
            row.Delete();
      }

      dt.AcceptChanges();

      gvDisplay.DataSource = dt;
      gvDisplay.DataBind();
   }
}

您将保存寄存器的事件应该是这样的。

protected void btnSave_Click(object sender, EventArgs e)
{
   foreach(DataRow row in dt.Rows)
   {
     SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["constring"]);
     SqlCommand cmd = new SqlCommand();

     cmd.CommandText = "INSERT INTO YOUR_TABLE_NAME (NAME, CITY) VALUES (" + row["Name"].ToString() + "," + row["City"].ToString() + ")";

     int numRegs = cmd.ExecuteNonQuery();
   }
}

我真的希望我能帮上忙。我无法测试我的代码,而且我不太擅长使用 DataTables,所以如果我的代码有任何问题,请告诉我。

我认为如果您使用 Bulk Inserts 来实现插入,效率会更高。搜索如何制作它,它非常酷和快速。

并且还尝试使用存储过程,因为它比使用直接命令文本更安全。使用它们将防止 SQL 注入。

此致。

于 2013-02-19T13:39:35.327 回答