none
DetailsView和GridView联动的问题 RRS feed

  • 问题

  • 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>&nbsp;</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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月26日 8:19

答案

  • 问题解决了,应该在点击更新后重新绑定GridView的SQLdatasource,也就是GridView.databind();

    详见 http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/556e0bc9-4aea-45dd-adf3-352dad5bee9e 第一楼的后台代码,真的好简单!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年4月18日 8:01

全部回复

  • DataSource和DataSourceId只能用一个——这个意味着你必须只能使用一个数据绑定源:要不是DataSource控件,否则手动代码绑定。

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月26日 8:22
  •     谢谢您的回复,我打算用前台的SQLDataSource,比较熟悉!

    继续使用下面的:

    <SelectParameters>
                    <asp:ControlParameter ControlID="GridView1" Name="EmployeeID" 
                        PropertyName="SelectedValue" />
                </SelectParameters>

        我也想只绑定一个,可是就是不知道怎么办。。。能否说的具体些呢?


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月26日 8:40
  • 删除

         this.GridView1.DataSource = ds;
            this.GridView1.DataBind();


    【孟子E章】

    2012年10月29日 0:33
    版主
  • 谢谢您的回复!不过这样删除并没有解决问题!

    我之所以在后台又写了

    protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)

    是因为每次我在DetailsView更新后,Gridview的数据不能同时显示出更新的结果,因此才写了上面这个DetailsView1_ItemUpdated事件。

          想请教一下,如何让Gridview也同时显示更新呢?MSDN演练上的那个例子是把Gridview和DetailsView用了同一个SQLdataSource,绕开了我遇到的这个问题,那个演练的例子太浅了,不适用!

       

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月29日 2:54
  • DetailsView对应的那个SqlDataSource的Updated事件中,直接调用绑定到GridView的那个SqlDataSource.Update()

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月29日 4:10
  • 我的GridView的SQldatasource只有个select命令啊,怎么调用SqldataSource。Update()??

    能否具体些呢?    这段代码弄得我这段时间晕晕的!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月29日 4:24
  • 不是,口误:)

    应该是直接调用GridView.DataBind();


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月29日 4:25
  • 我的GridView已经绑定了一个SqldataSource_GridView了,还用GridView。databind();?

    您的意思是不是去掉前台的SqldataSource_GridView,直接用后台的GridView_DataBind();呢?不过这样改的话我不知道如何给第一列加上 “选择” 这个列,更不知道该如何跟DetailsView联动了。。。


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月29日 5:20
  • 对啊,重新绑定一次,以便刷新更新的结果集。

    或者直接:SqlDataSource.DataBind()


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月31日 4:43
  • 你的FormView和GridView都是指向同一个数据库的数据表?

    那么尝试使用GridView.DataBind();

    另外请告知你的代码写在何处的?


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月31日 5:50
  • 你的FormView和GridView都是指向同一个数据库的数据表?

    那么尝试使用GridView.DataBind();

    另外请告知你的代码写在何处的?



    顶楼我 公布了 完整的代码啊!    按照您的提示,我做的修改。。。

    而且我也没什么FormView,GridView。DataBind();我早试过了,错误提示在楼顶的图1 中.。



    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年10月31日 11:29
  • 问题解决了,应该在点击更新后重新绑定GridView的SQLdatasource,也就是GridView.databind();

    详见 http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/556e0bc9-4aea-45dd-adf3-352dad5bee9e 第一楼的后台代码,真的好简单!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年4月18日 8:01