【菜鸟请教】关于DataGrid和DataTable的...
请教各位前辈,
我在DataGrid中绑定了一个有3行空值的DataTable。
怎么能做到在DataGrid编辑状态,点击更新时把当前行新添入的值更新到DataTable对应的行中?
最后窗体上有一个保存按钮,点击保存按钮时,又如何把DataTable中各行的值依次插入数据库?
问题点数:100、回复次数:18Top
1 楼libinguest(上善若水)回复于 2005-06-01 22:39:08 得分 5
private void dgdone_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string str=((TextBox)e.Item.Cells[2].Controls[0]).Text;
SqlConnection conn=new SqlConnection"server=LIBIN;database=stu_info;uid=sa;pwd=1129");
SqlCommand cmd=new SqlCommand("proupdate",conn);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add"@id",SqlDbType.Int,4).Value=Convert.ToInt32(str);//此参数代表每条记录在数据源中的唯一ID号
str=((TextBox)e.Item.Cells[3].Controls[0]).Text;
cmd.Parameters.Add("@name",SqlDbType.VarChar,20).Value=str; str=((TextBox)e.Item.Cells[4].Controls[0]).Text;
cmd.Parameters.Add("@pwd",SqlDbType.VarChar,20).Value=str;
conn.Open();
cmd.ExecuteNonQuery();
this.dgdone.EditItemIndex=-1;
conn.Close();
Query();//这是个刷新DataGrid的自定义方法。
}
你做个参考吧!Top
2 楼xiaopai20(小排——流浪狗)回复于 2005-06-01 23:03:42 得分 5
private void dataGridSubject_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.dataGridSubject.EditItemIndex = e.Item.ItemIndex;
//重新绑定下数据
}
private void dataGridSubject_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.dataGridSubject.EditItemIndex = -1;
//重新绑定下数据
}
private void dataGridSubject_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int id = Convert.ToInt32( this.dataGridSubject.DataKeys[e.Item.ItemIndex] );
SqlProvider.Subject.Instance().Update( id, ((TextBox)e.Item.Cells[0].Controls[0]).Text,
((TextBox)e.Item.Cells[1].Controls[0]).Text,
((TextBox)e.Item.Cells[2].Controls[0]).Text, ((TextBox)e.Item.Cells[3].Controls[0]).Text,
// Convert.ToInt32(e.Item.Cells[4].Text),
Convert.ToInt32(((TextBox)e.Item.Cells[5].Controls[0]).Text),
Convert.ToInt32( e.Item.Cells[6].Text ) );
this.dataGridSubject.EditItemIndex = -1;
//重新绑定下数据
}
private void dataGridSubject_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int id = Convert.ToInt32( this.dataGridSubject.DataKeys[e.Item.ItemIndex] );
SqlProvider.Subject.Instance().Delete( id );
this.dataGridSubject.EditItemIndex = -1;
//重新绑定下数据
}Top
3 楼snrfqbgu(清晨晚风)回复于 2005-06-02 09:32:27 得分 0
请问把DataGrid中的数据更新到DataTable中有什么好的方法吗?
Top
4 楼snrfqbgu(清晨晚风)回复于 2005-06-02 11:59:26 得分 0
急呀~~~~~~~~自己顶一下:(Top
5 楼snrfqbgu(清晨晚风)回复于 2005-06-03 11:53:52 得分 0
555555石沉大海了.....Top
6 楼hchxxzx(NET?摸到一点门槛)回复于 2005-06-03 12:51:30 得分 15
请问把DataGrid中的数据更新到DataTable中有什么好的方法吗?
-------
没有什么好办法,只能一行一行取值,一行一行更新.取出,写入.
但你这种方式不太好.你可到如下地址,看一个完整的DATAGRID操作实例.
http://community.csdn.net/Expert/topic/4016/4016964.xml?temp=.5576746Top
7 楼liuqinglq(白菜)回复于 2005-06-03 12:58:43 得分 0
请问把DataGrid中的数据更新到DataTable中有什么好的方法吗?
-----------------
楼主的要求有点奇怪
是只要更新到DataTable而不更新到数据库么?Top
8 楼snrfqbgu(清晨晚风)回复于 2005-06-04 13:16:42 得分 0
楼主的要求有点奇怪
是只要更新到DataTable而不更新到数据库么?
--------------------------
呵呵,是呀,要求是这样的:
窗体上有个'添加'和‘保存’按钮,点击‘添加’时,在DataGrid中添加数行空白记录,用户使用DataGrid的编辑功能进行添加记录。最后点击‘保存’按钮,把上面数条记录一起更插入到数据中。
我是初学者,所以百思不得其解了@_@Top
9 楼itflying(it学习者 )回复于 2005-06-04 13:44:47 得分 15
下面的这个例子提供了利用DataGrid编辑、修改、删除记录的方法,数据库字段名称和类型如下。
数据库aa中表 people:People.sql
if exists (select * from dbo.sysobjects where
id = object_id(N'[dbo].[People]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[People]
GO
CREATE TABLE [dbo].[People] (
[pkID] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [char] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[LastName] [char] (100) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
EditDataGridCS.aspx
<%@ Page Language="c#" debug="true"%>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
//make first sql
String sql = "";
String strCnn = "Data Source=.;Initial Catalog=aa;User Id=sa;Password=;";
//create a datasource function
public ICollection CreateDataSource () {
SqlConnection conn = new SqlConnection(strCnn);
SqlDataAdapter db_sqladaptor = new SqlDataAdapter(sql,conn);
DataSet ds = new DataSet();
db_sqladaptor.Fill(ds,"MyDataResult");
DataView myView = ds.Tables["MyDataResult"].DefaultView;
return myView;
}
//do page load
public void Page_Load(Object sender, EventArgs e) {
strCnn = "Data Source=.;Initial Catalog=aa;User Id=sa;Password=;";
if (!IsPostBack)
{
sql = "Select * FROM People";
People.DataSource = CreateDataSource();
People.DataBind();
}
}
public void Page_Grid(Object sender, DataGridPageChangedEventArgs e)
{
sql = "Select * FROM People";
// Set CurrentPageIndex to the page the user clicked.
People.CurrentPageIndex = e.NewPageIndex;
// Rebind the data.
People.DataSource = CreateDataSource();
People.DataBind();
}
public void People_Edit(Object sender, DataGridCommandEventArgs e)
{
sql = "Select * FROM People";
People.EditItemIndex = e.Item.ItemIndex;
People.DataSource = CreateDataSource();
People.DataBind();
}
public void People_Cancel(Object sender, DataGridCommandEventArgs e)
{
sql = "Select * FROM People";
People.EditItemIndex = -1;
People.DataSource = CreateDataSource();
People.DataBind();
}
public void People_Update(Object sender, DataGridCommandEventArgs e)
{
string FirstName = ((TextBox)e.Item.Cells[1].Controls[1]).Text;
string LastName = ((TextBox)e.Item.Cells[2].Controls[1]).Text;
SqlConnection connUpdate = new SqlConnection(strCnn);
connUpdate.Open();
String sql_edit = "UPDATE People " +
"SET FirstName = '" + FirstName.Replace("'","''")+ "'," +
"LastName = '" + LastName.Replace("'","''")+ "'" +
" WHERE pkID = " + e.Item.Cells[0].Text;
SqlCommand sqlCommandUpdate = new SqlCommand(sql_edit,connUpdate);
sqlCommandUpdate.ExecuteNonQuery();
connUpdate.Close();
sql = "Select * FROM People";
People.EditItemIndex = -1;
People.DataSource = CreateDataSource();
People.DataBind();
}
public void People_Delete(Object sender, DataGridCommandEventArgs e) {
SqlConnection connDel = new SqlConnection(strCnn);
connDel.Open();
String sql_Del = "DELETE FROM People " +
" WHERE pkID = " + e.Item.Cells[0].Text;
SqlCommand sqlCommandDel = new SqlCommand(sql_Del,connDel);
sqlCommandDel.ExecuteNonQuery();
connDel.Close();
sql = "Select * FROM People";
People.EditItemIndex = -1;
People.DataSource = CreateDataSource();
People.DataBind();
}
</script>
<font face="arial" size="3">
<b>Edit People</b>
</font>
<br>
<form runat="server">
<asp:DataGrid id="People" runat="server"
BorderColor="green"
Width="640"
PageSize="5"
AllowPaging="true"
OnPageIndexChanged="Page_Grid"
BorderWidth="1"
CellPadding="3"
AutoGenerateColumns="false"
ShowHeader="true"
Visible="true"
OnEditCommand="People_Edit"
OnCancelCommand="People_Cancel"
OnUpdateCommand="People_Update"
OnDeleteCommand="People_Delete">
<HeaderStyle BorderColor="White" BackColor="black"
ForeColor="White"
Font-Bold="True"
Font-Name="Arial"
Font-Size="9" HorizontalAlign="Center"/>
<ItemStyle BorderColor=""
BackColor="#FFFFF0"
ForeColor="Black"
Font-Name="Arial"
Font-Size="8"
Font-Bold="False" HorizontalAlign="Center"/>
<EditItemStyle BorderColor=""
BackColor="#FFFFF0"
ForeColor="Black"
Font-Name="Arial"
Font-Size="7"
Font-Bold="False" HorizontalAlign="Center"/>
<PagerStyle Mode="NumericPages" Font-Size="8"/>
<Columns>
<asp:BoundColumn HeaderText="ID" ReadOnly="true" DataField="pkID"/>
<asp:TemplateColumn>
<HeaderTemplate>
<b> First Name </b>
</HeaderTemplate>
<ItemTemplate>
<asp:Label
Text='<%# DataBinder.Eval(Container.DataItem, "FirstName").ToString().Trim() %>'
runat="server"/>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="FirstName" Text='
<%# DataBinder.Eval(Container.DataItem, "FirstName").ToString().Trim() %>'
runat="server" Width="100%"/>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<HeaderTemplate>
<b> Last Name </b>
</HeaderTemplate>
<ItemTemplate>
<asp:Label
Width="200"
Text='<%# DataBinder.Eval(Container.DataItem, "LastName").ToString().Trim() %>'
runat="server"/>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="LastName" Text='<br>
<%# DataBinder.Eval(Container.DataItem, "LastName").ToString().Trim() %>'
runat="server" Width="100%"/>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn
ButtonType="LinkButton"
CancelText="Cancel"
EditText="Edit"
UpdateText="Update" />
<asp:ButtonColumn Text= "Delete" CommandName="Delete"></asp:ButtonColumn>
</Columns>
</asp:DataGrid>
</form>
Top
10 楼jerry_yuan(jerry)回复于 2005-06-04 14:07:42 得分 10
给你一个思路:
1、定义一个DataTable ,设置主键
2、把数据库的数据绑到datatable
3、在datagrid更新时,找到datatable对应的行
4、更新找到的行,再将datagrid重新绑定修改后的datatable
5、点确定时,用循环取一行datatable的数据更新数据库(取一行更新一行)
Top
11 楼renyu732(Sysinfo)回复于 2005-06-04 17:46:05 得分 0
upTop
12 楼criedshy(哭泣的天空)回复于 2005-06-15 06:49:39 得分 0
怎么不直接保存到数据库中?Top
13 楼srz007(呵呵)回复于 2005-06-15 08:58:13 得分 20
楼主应该把这个DataTable转化并序列化保存到viewstate里或直接保存到内存中来临时的保存数据,最后点那个总的"保存"按钮时再把DataTable里的数据插入到数据库Top
14 楼brightheroes(在地狱中仰望天堂)回复于 2005-06-15 09:06:53 得分 30
类似这样的需求,可以考虑用Session或者是ViewState(数据量较小的时候),来保存这个DataTable
每次页面PostBack都重新从Session里面获取这个数据源并且重新绑定。
修改,删除的时候,直接操作这个数据源的对应行。
最后提交的时候,遍历这个DataTable,根据DataRow的
RowState来判断是Insert,Update,还是DeleteTop
15 楼bgu(彼岸)回复于 2005-06-15 09:08:06 得分 0
WebForm不是WinForm
没有必要这样做。Top
16 楼ghchen()回复于 2005-06-15 09:48:49 得分 0
楼上说得很详细呢Top
17 楼brightheroes(在地狱中仰望天堂)回复于 2005-06-15 09:49:12 得分 0
有的时候还是有这样的需求的Top
18 楼snrfqbgu(清晨晚风)回复于 2005-07-02 10:33:46 得分 0
在asp.net中 这样的需求根本就是蛇足,呵呵
结贴了,谢谢大家帮忙!Top




