如何使用键来填充网格视图来自会话

时间:2012-10-06 18:31:14

标签: asp.net .net arraylist

我想创建一个在线商店网站。

我创建了一个在我的网站上显示我的产品的数据列表,我将LinkBut​​ton放在我的数据列表中,以获取用户选择的产品的productID并将其添加到购物车。

 <asp:LinkButton ID="LinkButton1" runat="server" Text="Add To Cart" CommandName="addtocart" CommandArgument='<%# Eval("id")%>' >

当用户点击链接按钮时,此事件将触发:

protected void theDataList_ItemCommand(object source, DataListCommandEventArgs e)
{
//this add the selected product-id to the list<int> and put it in the 
//  session["addtocart"]
        if (e.CommandName == "addtocart")
        {                                 
            int productid = Convert.ToInt32(e.CommandArgument);
            Label6.Text = productid.ToString();


            List<int> productsincart = (List<int>)Session["addtocart"];
            if (productsincart == null)
            {
                productsincart = new List<int>();
            }

            productsincart.Add(productid);

            Session["addtocart"] = productsincart;
} 

之后,当用户点击它的文字是“显示购物车”的按钮时, 用户将看到shoppingcart.aspx页面

    Response.Redirect("shoppingcart.aspx");

在这个页面中我有一个gridview,我想将它绑定到session [“addtocart”]; 当页面加载gridview时显示他们的id在会话[“购物车”]中的所选产品 但它不起作用,这个错误发生了: System.InvalidCastException:Object必须实现IConvertible。

这是相关代码:

            <asp:GridView ID="GridView3" runat="server"  
            DataSourceID="SqlDataSource1"   >

           <columns>
            <asp:BoundField DataField="id" HeaderText="id" SortExpression="id" />
            <asp:BoundField DataField="name" HeaderText="post" SortExpression="post" />
            <asp:BoundField DataField="price" HeaderText="salary" 
                SortExpression="salary" />
            <asp:BoundField DataField="color" HeaderText="years" SortExpression="years" />

        </columns>

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:employeeConnectionString4 %>" 
        SelectCommand="SELECT * FROM [products] WHERE ([productid] = @productid)">
        <SelectParameters>
            <asp:SessionParameter DefaultValue="7" Name="cart" SessionField="cart" 
                Type="Int32" />
        </SelectParameters>

我知道问题与GridView3和Session [“addtocart”]有关,我认为GridView3无法将存储在Session [“addtocart”]中的Integer列表对象的值转换为Integer,在我看来,错误来自从会话对象到整数列表的转换,但我不知道如何解决这个问题,如果任何身体帮助我,我变得如此感激。

会话中的对象[“购物车”]是一个整数列表,其中包含用户选择要购买的productid列表。 它给了我这个错误:

对象必须实现IConvertible。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

异常详细信息:System.InvalidCastException:Object必须实现IConvertible。

来源错误:

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

堆栈追踪:

[InvalidCastException: Object must implement IConvertible.]
System.Convert.ChangeType(Object value, TypeCode typeCode, IFormatProvider provider)   +2880621
System.Web.UI.WebControls.Parameter.GetValue(Object value, String defaultValue, TypeCode type, Boolean convertEmptyStringToNull, Boolean ignoreNullableTypeChanges) +141
System.Web.UI.WebControls.Parameter.GetValue(Object value, Boolean ignoreNullableTypeChanges) +63
System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext context, Control control) +301
System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(DbCommand command, ParameterCollection parameters, IDictionary exclusionList) +264
System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +472
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +19
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +142
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73
System.Web.UI.WebControls.GridView.DataBind() +4
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +72
System.Web.UI.Control.EnsureChildControls() +87
System.Web.UI.Control.PreRenderRecursiveInternal() +44
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842

1 个答案:

答案 0 :(得分:0)

问题出在您的Sql参数中。当您尝试执行此操作时,它无法将类型List<int>强制转换为Int32。看起来List对象无论如何都没有实现iConvertible,因此您需要采用不同的方法。

我通常不会像你一样使用SqlDataSource,但是这里有一种方法可以为你想要的查询构建正确的语法:

将您的标记更新为:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:employeeConnectionString4 %>" />

然后在Page_Load上,构建你的连接字符串:

public void Page_Load(object sender, EventArgs e)
{
    this.SqlDataSource1.SelectCommand = String.Format("SELECT * FROM [products] WHERE [productid] in ({0}))", GetInValues(Session["cart"] as List<int>));
}
public string GetInValues(List<int> lst)
{
    System.Text.StringBuilder sValues = new System.Text.StringBuilder();
    if (i == null)
        sValues.Append(0);
    else
    {
        foreach (int i in lst)
        {
            if (sValues.Length > 0)
                sValues.Append(", ");
            sValues.Append(i);
        }
    }
    return sValues.ToString();
}

就像我说的那样,可能有一种方法可以在标记中做到这一点,但它并不是我熟悉的。

您还可以创建一个继承List并实现iCovertible的类,但我不能想到一种可以作为SqlParameter工作的方法。如果我没记错的话,iConvertible界面就像15个函数一样,所以对于这个实例来说似乎有很多工作。