我正在使用网格视图来显示数据,并希望在下拉列表中选择索引更改时更新数据库数量列。再次要明确我不想使用任何更新按钮,它应该采取行动作为下拉列表选择项目更改。 Grid-view的代码是
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1"
onselectedindexchanged="GridView1_SelectedIndexChanged"
DataKeyNames="Cart_id" onrowcommand="GridView1_RowCommand">
<Columns>
<asp:CommandField DeleteText="Remove" ShowDeleteButton="True"
ButtonType="Image" DeleteImageUrl="~/images/remove-to-cart-icon.jpg"
HeaderText="Remove" >
<ControlStyle Height="30px" Width="50px" />
</asp:CommandField>
<asp:TemplateField HeaderText="Cart_id" InsertVisible="False"
SortExpression="Cart_id" Visible="False">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("Cart_id") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Cart_id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Product_name" HeaderText="Product_name"
SortExpression="Product_name" ReadOnly="True" />
<asp:BoundField DataField="Product_cost" HeaderText="Product_cost"
SortExpression="Product_cost" ReadOnly="True" />
<asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Quantity") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
SelectedValue='<%# Bind("Quantity", "{0}") %>'
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
CommandName="Change" AutoPostBack="True">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
<asp:ListItem>5</asp:ListItem>
<asp:ListItem>6</asp:ListItem>
<asp:ListItem>7</asp:ListItem>
<asp:ListItem>8</asp:ListItem>
<asp:ListItem>9</asp:ListItem>
<asp:ListItem>10</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:shoppingConnectionString2 %>"
DeleteCommand="DELETE FROM [Cart] WHERE [Cart_id] = @Cart_id"
SelectCommand="SELECT * FROM [Cart] WHERE ([User_id] = @User_id)"
InsertCommand="INSERT INTO [Cart] ([User_id], [Product_id], [Product_name], [Product_cost], [Quantity]) VALUES (@User_id, @Product_id, @Product_name, @Product_cost, @Quantity)"
UpdateCommand="UPDATE [Cart] SET [User_id] = @User_id, [Product_id] = @Product_id, [Product_name] = @Product_name, [Product_cost] = @Product_cost, [Quantity] = @Quantity WHERE [Cart_id] = @Cart_id">
<DeleteParameters>
<asp:Parameter Name="Cart_id" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="User_id" Type="String" />
<asp:Parameter Name="Product_id" Type="Int32" />
<asp:Parameter Name="Product_name" Type="String" />
<asp:Parameter Name="Product_cost" Type="Int32" />
<asp:Parameter Name="Quantity" Type="Int32" />
</InsertParameters>
<SelectParameters>
<asp:QueryStringParameter Name="User_id" QueryStringField="uid" Type="String" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="User_id" Type="String" />
<asp:Parameter Name="Product_id" Type="Int32" />
<asp:Parameter Name="Product_name" Type="String" />
<asp:Parameter Name="Product_cost" Type="Int32" />
<asp:Parameter Name="Quantity" Type="Int32" />
<asp:Parameter Name="Cart_id" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
我希望在更改dropdownlist值时将cartid值存储在后端的变量中,以便我可以更新我的数据库。
答案 0 :(得分:0)
我认为这只是在Load事件中调用SQLDataSource1.Update()的问题。
从MSDN关于SQLDataSource.Update()方法: “如果数据已更改,则在回发期间,GridView,DetailsView和FormView控件会自动调用Update方法。对于已在其他控件中更改的数据,可以在Load事件期间在回发时显式调用Update方法。”
看来你已经把所有东西都正确连接好了。所以,我会在你的Page_Load事件中尝试这个。
void Page_Load (Object sender, EventArgs e) {
if (!IsPostBack) {
// non post back stuff
}
else {
SQLDataSource1.Update ();
}
}
我还会从DropDownList标记中取出CommandName =“Change”。我认为这不会做任何事情,可能会阻碍这项行动。
如果这不起作用,可能尝试定义DropDownList1_SelectedIndexChanged事件:
void DropDownList1_SelectedIndexChanged(Object sender, EventArgs e) {
SQLDataSource1.Update ();
}
很抱歉,希望我能更加确定,但我现在无法在我的开发机器上测试它。
希望这有帮助。
汤姆