积极答复者
DetailsView和GridView联动的问题

问题
-
GridView控件自带了“编辑”功能,然而我的SQL数据库中的表,字段都很多,往往是排成长长的一排,GridView的编辑功能已经不合适。
因此我想改进“编辑”功能,我想设计成 点击某一行的 “编辑” 键,就能弹出一个窗口,该窗口根据我的排版显示该行的全部内容。并且,我的数据表中还有图像类型的数据,要设计出点击某个按钮,又能弹出该图像的功能。
按照大大们提供的代码,我按需做了修改,有了很大的进展但也遇到了新问题
问题1:点击某一列确实可以出现新窗口了,然而这个窗口是在网页的顶部打开,当我的网页很长,需要上下滚动阅读时,点击“选择”,当前位置就会一下回到页面顶端。能否该进程成保持网页当前位置的基础上弹出一个新的窗口呢?
问题2:当我对DetailsView进行数据修改时,用什么事件绑定最好呢?如果光是绑定ItemUpdated事件的话,那进行Deleted和Inserted就没反应了!
问题3:测试时我用的DetailsView_ItemUpdated事件,出现如图所示错误,要如何修改呢?(测试时我发现虽然发生异常,但实际上数据还是更新了,难道这种问题还要用 try catch ???)
下面附上图及前台、后台代码!
-----------------------------图1-----------------------------------------
----------------------------前台代码-------------------------------------
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> <!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 id="Head1" runat="server"> <title></title> <%--<script language="javascript">--%> <script type="text/javascript"> //****************************************************** function controlDiv(DivID,divCase){ var divs=document.getElementById(DivID); var v_left=(document.body.clientWidth-300)/2 + document.body.scrollLeft; //divs.clientWidth var v_top=(document.body.clientHeight-divs.clientHeight)/2 + document.body.scrollTop; if(divCase==1){ divs.style.left=v_left+'px'; divs.style.top=v_top+'px'; divs.style.display="block"; //显示DIV }else if(divCase==2) divs.style.display="none"; //屏蔽DIV else divs.innerHTML=divCase; //输出HTML文本到DIV } //****************************************************** </script> </head> <body> <form id="form1" runat="server"> <%--<div align="center"> <p> </p> <p><a href="#" onclick="controlDiv('msgDiv',1)">点击弹出</a></p> </div>--%> <%--<div align="center"><a href="#" onclick="controlDiv('msgDiv',1)">点击弹出</a></div>--%> <div id="msgDiv"> <h1><span>[<a href="#" onclick="controlDiv('msgDiv',2)">关闭</a>]</span>弹出窗口</h1> <%--<div align="center"><br />--%> <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource_DetaisView" Height="50px" Width="125px" onitemupdated="DetailsView1_ItemUpdated"> <Fields> <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" /> <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" /> <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" /> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" /> </Fields> </asp:DetailsView><br /> <%--</div>--%> </div> <div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource_GridView"> <Columns> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="btn_Select" runat="server" CausesValidation="False" CommandName="Select" Text="选取"></asp:LinkButton> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" /> <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource_DetaisView" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" DeleteCommand="DELETE FROM [Employees] WHERE [EmployeeID] = @EmployeeID" InsertCommand="INSERT INTO [Employees] ([LastName], [FirstName] ) VALUES (@LastName, @FirstName) " SelectCommand="SELECT [EmployeeID], [LastName], [FirstName] FROM [Employees] WHERE [EmployeeID] = @EmployeeID" UpdateCommand="UPDATE [Employees] SET [LastName] = @LastName, [FirstName] = @FirstName WHERE [EmployeeID] = @EmployeeID" > <SelectParameters> <asp:ControlParameter ControlID="GridView1" Name="EmployeeID" PropertyName="SelectedValue" /> </SelectParameters> <DeleteParameters> <asp:Parameter Name="EmployeeID" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="LastName" Type="String" /> <asp:Parameter Name="FirstName" Type="String" /> <asp:Parameter Name="EmployeeID" Type="Int32" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="LastName" Type="String" /> <asp:Parameter Name="FirstName" Type="String" /> </InsertParameters> </asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSource_GridView" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT [EmployeeID], [LastName] FROM [Employees]"> </asp:SqlDataSource> </div> </form> </body> </html>
--------------------------后台代码---------------------------
protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e) { string strconn = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; SqlConnection con = new SqlConnection(strconn); con.Open(); SqlDataAdapter sda = new SqlDataAdapter("SELECT [EmployeeID], [LastName], [FirstName] FROM [Employees] ", con); DataSet ds = new DataSet(); sda.Fill(ds); this.GridView1.DataSource = ds; this.GridView1.DataBind(); }
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
答案
-
问题解决了,应该在点击更新后重新绑定GridView的SQLdatasource,也就是GridView.databind();
详见 http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/556e0bc9-4aea-45dd-adf3-352dad5bee9e 第一楼的后台代码,真的好简单!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
- 已标记为答案 linjiangxian11 2013年4月18日 8:02
全部回复
-
删除
this.GridView1.DataSource = ds; this.GridView1.DataBind();
【孟子E章】
- 已建议为答案 ThankfulHeart 2012年10月29日 2:15
- 取消建议作为答案 linjiangxian11 2012年10月29日 2:48
-
谢谢您的回复!不过这样删除并没有解决问题!
我之所以在后台又写了
protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
是因为每次我在DetailsView更新后,Gridview的数据不能同时显示出更新的结果,因此才写了上面这个DetailsView1_ItemUpdated事件。
想请教一下,如何让Gridview也同时显示更新呢?MSDN演练上的那个例子是把Gridview和DetailsView用了同一个SQLdataSource,绕开了我遇到的这个问题,那个演练的例子太浅了,不适用!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
-
- 已编辑 ThankfulHeart 2012年10月29日 5:22
-
按照您的提示修改了代码:没用啊!至少我在点击DetailsView的“更新”后没有在GridView中立刻显示出更新后的结果来!
string strconn = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; SqlConnection con = new SqlConnection(strconn); con.Open(); SqlDataAdapter sda = new SqlDataAdapter("SELECT [EmployeeID], [LastName], [FirstName] FROM [Employees] ", con); DataSet ds = new DataSet(); sda.Fill(ds); //this.GridView1.DataSource = ds; //this.GridView1.DataBind(); SqlDataSource_GridView1.DataBind();
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
-
问题解决了,应该在点击更新后重新绑定GridView的SQLdatasource,也就是GridView.databind();
详见 http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/556e0bc9-4aea-45dd-adf3-352dad5bee9e 第一楼的后台代码,真的好简单!
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
- 已标记为答案 linjiangxian11 2013年4月18日 8:02