导航
  • 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ
  • 问答

GridView 的SqlCommand和SqlAdapter删除更新和插入

bhtfg538 2008-06-15 04:04:27
rt
<asp:GridView ID="G1" runat="server" AlternatingRowStyle-BackColor="#eeeeee" HeaderStyle-BackColor="#aaaadd" OnPageIndexChanging="Page_Change" OnSorting="Sort_Change" AllowPaging="true" AllowSorting="true" OnRowEditing="Row_Edit" OnRowCancelingEdit="Row_Cancel" OnRowUpdating="Row_Update" OnRowDeleting="Row_Delete">
<Columns>
<asp:CommandField EditText="编辑" CancelText="取消" UpdateText="更新" HeaderText="操作" ShowEditButton="true" DeleteText="删除" ShowDeleteButton="true"/>
</Columns>
</asp:GridView>
我给了 OnRowDeleting事件函数
protected void Row_Delete(object sender,GridViewDeleteEventArgs e)
{

string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
string sql = "delete Customers where CustomerID='" + CustomerID + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
G1.EditIndex = -1;
BindGrid();
}
为什么说 index出错 超过索引
我把 e.RowIndex 输出来看是正确的噢!
请大侠帮我解决下 这个问题
顺便 给及个例子
关于GridView
用SqlCommand 删除 编辑 增加 更新
和用 SqlDataAdapter删除 编辑 增加 更新 的例子
web开发的得到分以后就全部砸这里了,大家积极回答谢谢啦
...全文
140 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
coding2ing 2008-11-19
关注中...
回复
bhtfg538 2008-06-15
好的 很感谢 amaddag大哥
就此结帐
回复
一品梅 2008-06-15
[Quote=引用 15 楼 bhtfg538 的回复:]
string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
这样为什么获得不到ID
[/Quote]
.aspx代码里压根就没有这个控件啊,楼主少写东西了吧
回复
amandag 2008-06-15
Conn.Close();

如果你贴的页面代码是全部的,那么转为TextBox很奇怪,而且我已经提过,用Controls[index]的方式去找控件是很不好的,对于一种不好的方式,再去研究下去就是浪费时间
回复
bhtfg538 2008-06-15
哦 呵呵~·关闭 我知道
以后会注意 这是测试 一下为什么删除不了
string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
这样为什么获得不到ID

G1.DataKeyNames = new string[] { "CustomerID" };
用DataKeyNames 是可以获得iD那个已经测试了
关闭 是不是
cmd.Connection.Close();
还是 conn.close();
回复
amandag 2008-06-15
很感谢 这个方法 我也知道 我只是想知道为什么 那样获取不到
索引会有错误~
==
用索引去找控件是非常不可靠的行为,一般就算找控件,也是使用TemplateField,然后去FindControl

就下面这句代码
string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
有可能有错的地方

1. 确认是Cell[1]?
2. 确认是Controls[0]?
这个地方是很诡异的,有时候不小心加的一个空格会让你的控件访问是Controls[1]
3. 确认是TextBox?
没有看到你的页面设置Columns的详细内容,很奇怪的是,既然是删除,怎么会根据一个文本框里的值进行删除,莫非是应该转换为Label?还有,如果你用的BoundField
可能
string CustomerID = G1.Rows[e.RowIndex].Cells[1].Text;//Text已经是string类型了,还ToString()?
即可
但即使这样,仍然防不住诡异的Controls[0],想查到具体的Control,要单步调试到这里慢慢看
回复
amandag 2008-06-15
楼主,你的代码颇有问题,web应用程序不是这样用数据库连接的

应该是每一次执行数据库命令前后打开和关闭数据库连接
回复
amandag 2008-06-15
protected void BindGrid()
{
DataView gv = (DataView)Create();
gv.Sort = (string)ViewState["SortField"];
G1.DataSource = gv;
G1.DataBind();
}
//替换为
protected void BindGrid()
{
DataView gv = (DataView)Create();
gv.Sort = (string)ViewState["SortField"];
G1.DataSource = gv;
G1.DataKeyNames = new string[] { "CustomerID" }; G1.DataBind();
}

protected void Row_Delete(object sender, GridViewDeleteEventArgs e)
{
string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
string sql = "delete Customers where CustomerID='" + CustomerID + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
G1.EditIndex = -1;
BindGrid();
}
//替换为

protected void Row_Delete(object sender, GridViewDeleteEventArgs e)
{
// string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
string sql = "delete Customers where CustomerID= @CustomerID";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@CustomerID", G1.DataKeys[e.RowIndex].Value);
cmd.ExecuteNonQuery();
G1.EditIndex = -1;
BindGrid();
}
回复
bhtfg538 2008-06-15
[Quote=引用 10 楼 mengxj85 的回复:]
设置Gridview的DatakeyName为G1的关键字再通过如下获取Id
string CustomerID = this.G1.DataKeys[e.RowIndex].Value.ToString();
[/Quote]
很感谢 这个方法 我也知道 我只是想知道为什么 那样获取不到
索引会有错误~
回复
mengxj85 2008-06-15
设置Gridview的DatakeyName为G1的关键字再通过如下获取Id
string CustomerID = this.G1.DataKeys[e.RowIndex].Value.ToString();

回复
bhtfg538 2008-06-15
[Quote=引用 8 楼 chengqscjh 的回复:]
string CustomerID =e.Item.Cells[0].Text
[/Quote]
大哥不是 DataList好不好
GridView 那来的e.Item.Cells[0].Text
回复
chengqscjh 2008-06-15
string CustomerID =e.Item.Cells[0].Text
回复
chengqscjh 2008-06-15
string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
----------------------------------------------------------------------------
你看这个是否问题,Cells[1].Controls[0],索引出现问题,跟踪调试下
回复
bhtfg538 2008-06-15
大家帮忙哦 给个好例子 稍微解释下
不可能太简单大家不帮我噢

5555555555555555555
回复
bhtfg538 2008-06-15
Dataset 我也是删除出问题
大家给个完整的例子 百度找好久都没发现
DataRow的插入
DataRow dr=ds.Tables["Customers"].NewRow();
dr[".."]=...
...
ds.Tables["Customers"].Rows.Add(dr);
sda.Update(ds,"Customers");
回复
bhtfg538 2008-06-15
大家来帮忙哦 。不给再明天加分
回复
Jade_2008 2008-06-15
关注!!
回复
bhtfg538 2008-06-15
也就是Dataset 操作
回复
bhtfg538 2008-06-15
我贴上其他我那个例子的代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Debug="true"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="G1" runat="server" AlternatingRowStyle-BackColor="#eeeeee" HeaderStyle-BackColor="#aaaadd" OnPageIndexChanging="Page_Change" OnSorting="Sort_Change" AllowPaging="true" AllowSorting="true" OnRowEditing="Row_Edit" OnRowCancelingEdit="Row_Cancel" OnRowUpdating="Row_Update" OnRowDeleting="Row_Delete">
<Columns>
<asp:CommandField EditText="编辑" CancelText="取消" UpdateText="更新" HeaderText="操作" ShowEditButton="true" DeleteText="删除" ShowDeleteButton="true"/>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>



×.cs
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class Default2 : System.Web.UI.Page
{
SqlConnection conn;
protected void Page_Load(object sender, EventArgs e)
{
string connstr = "Data Source=SAI;Initial Catalog=Northwind;Persist Security Info=True;User id=sa;Password=maojianps0";
conn = new SqlConnection(connstr);
conn.Open();
if (!IsPostBack)
{

BindGrid();
}
}
protected void BindGrid()
{
DataView gv = (DataView)Create();
gv.Sort = (string)ViewState["SortField"];
G1.DataSource = gv;
G1.DataBind();
}
ICollection Create()
{
string sql = "select * from Customers";
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
DataSet ds=new DataSet();
sda.Fill(ds, "Customers");
return ds.Tables["Customers"].DefaultView;
}
protected void Page_Change(object sender, GridViewPageEventArgs e)
{
G1.PageIndex = e.NewPageIndex;
BindGrid();
}
protected void Sort_Change(object sender, GridViewSortEventArgs e)
{
if ((string)ViewState["SortField"] != e.SortExpression)
{
ViewState["SortField"] = e.SortExpression;
}
else
{
ViewState["SortField"] = e.SortExpression + " " + "DESC";
}
BindGrid();
}
protected void Row_Edit(object sender, GridViewEditEventArgs e)
{
G1.EditIndex = e.NewEditIndex;
BindGrid();
}
protected void Row_Delete(object sender,GridViewDeleteEventArgs e)
{
//id 怎么获得
string sql = "delete Customers where CustomerID='" + CustomerID + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
G1.EditIndex = -1;
BindGrid();
}
protected void Row_Update(object sender,GridViewUpdateEventArgs e)
{
string CustomerID = ((TextBox)(G1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString();
string CompanyName = ((TextBox)(G1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString();
string sql = "update Customers set CompanyName='" + CompanyName + "' where CustomerID='" + CustomerID + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
G1.EditIndex = -1;
BindGrid();
}
protected void Row_Cancel(object sender, GridViewCancelEditEventArgs e)
{
G1.EditIndex = -1;
BindGrid();
}
}
然后用 SqlDataAdapter怎么写
回复
发动态
发帖子
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
社区公告
暂无公告