我有一个GridView包含从单击按钮时从两个TextBox中提取的数据。我希望在Gridview中实现以下功能:1)我希望能够在此GridView中编辑数据。 2)我还应该能够从GridView中删除行。 3)最后,当我单击另一个Submit按钮时,Gridview中的所有行都应保存在数据库中。
它是一个基于Web的ASP.NET应用程序,使用C#(Visual Studio 2010)编写,并使用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();
}
}
在你的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的Column 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注入。
最好的祝福。