当前位置:编程学习 > C#/ASP.NET >>

SelectCommand改变后 Gridview 的更新就失败了,求解。

问题是这样的  
我令GridView1 绑定 SqlDataSource1
之后用一个dropdownlist1 改变SqlDataSource1.SelectCommand 的值
之后当我使用dropdownlist1 改变SqlDataSource1.SelectCommand 后再使用GridView1 
的更新的时候,我发现更新出现了些问题:假设通过修改了SqlDataSource1.SelectCommand 
产生了1个结果(比如原来的第六项)但是我点击“编辑”后,girdview 显示的却是原来Gridview中第一行的数据       不知道是为什么?
麻烦各位了。。。
一个例子的源代码如下
<%@ Page Language="C#" %>

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

<script runat="server">

    protected void DropDownList1_SelectedIndexChanged(object sender, 
EventArgs e)
    {
        SqlDataSource1.SelectCommand = "select * from url where id = '6'";
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
         <asp:GridView ID="GridView1" runat="server" 
AutoGenerateColumns="False" DataKeyNames="id"
            DataSourceID="SqlDataSource1">
            <Columns>
                <asp:CommandField ShowDeleteButton="True" 
ShowEditButton="True" />
                <asp:BoundField DataField="id" HeaderText="id" 
ReadOnly="True" SortExpression="id" />
                <asp:BoundField DataField="name" HeaderText="name" 
SortExpression="name" />
                <asp:BoundField DataField="url" HeaderText="url" 
SortExpression="url" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
ConnectionString="Data Source=MyPC\SQLEXPRESS;Initial Catalog=TASK1;User 
ID=sa;Password=sa"
            DeleteCommand="DELETE FROM [url] WHERE [id] = @id" 
InsertCommand="INSERT INTO [url] ([id], [name], [url]) VALUES (@id, @name, 
@url)"
            ProviderName="System.Data.SqlClient" SelectCommand="SELECT * 
FROM [url]" UpdateCommand="UPDATE [url] SET [name] = @name, [url] = @url 
WHERE [id] = @id">
            <DeleteParameters>
                <asp:Parameter Name="id" Type="Int16" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="name" Type="String" />
                <asp:Parameter Name="url" Type="String" />
                <asp:Parameter Name="id" Type="Int16" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="id" Type="Int16" />
                <asp:Parameter Name="name" Type="String" />
                <asp:Parameter Name="url" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
        <asp:DropDownList ID="DropDownList1" runat="server" 
AutoPostBack="True" 
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" 
DataSourceID="SqlDataSource1" DataTextField="id" DataValueField="id">
        </asp:DropDownList></div>
    </form>
</body>
</html>

--------------------编程问答-------------------- SqlDataSource  在每次刷新的时候回到你绑定的那一条T-SQL     
怎么保存T-SQL我没研究过    就自己定义个连接还实在写。。。。     --------------------编程问答-------------------- 没有人知道么? --------------------编程问答-------------------- 终于解决了!
这是由于SQLDataSource中的SelectCommand是不被保留的。 
所以当您修改了SelectCommand后,点击了编辑后,ASP.net会自动再重新生成一次SqlDataSource,而他的SelectCommand依旧使用的还是原先默认设置中的select * from Table。所以他会从去数据库中,将所有的数据都都回来。 
解决的方法就是将SelectCommand加入到Session或是ViewState或是Cookie中,然后再每次页面Load的时候,将内容付给SqlDataSource 
如下: 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 

SqlDataSource1.SelectCommand = "select * from table4 where id = '6'"; 
Session["SqlDataSouce1Command"] = SqlDataSource1.SelectCommand; 


protected void Page_Load(object sender, EventArgs e) 

if (!(Session["SqlDataSouce1Command"] == null)) 
SqlDataSource1.SelectCommand = Session["SqlDataSouce1Command"].ToString(); 



--------------------编程问答-------------------- 其实不用这么麻烦的,直接在Page_Load中加入
 if(!IsPostBack)
        {
         ****
        }
就可以了 --------------------编程问答-------------------- 加if(!IsPostBack){

}
还有个属性GridView里的一个属性DataKeyNames=ID --------------------编程问答--------------------
引用 4 楼 xiayuzhongdexiaotan 的回复:
其实不用这么麻烦的,直接在Page_Load中加入
 if(!IsPostBack)
        {
         ****
        }
就可以了

一般都是这样写的,很对 --------------------编程问答-------------------- 谢啦分享
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,