Gridview 每行有 2 个 DropDownLists

2 DropDownLists on each row of Gridview

我有一个基于数据库动态创建的gridview。 gridview 的某些行有 2 个 DropDownLists,而其他行则不依赖于行中的项目。该行的第二个 DropDownList 是根据第一个 DrowpDownMenu 的选择动态创建的。一切正常,除了,如果您在第一行进行选择,然后更改第二行第一个 DropDownList 的选择或单击更新按钮,它将重置第一行的第二个 DropDownList。这显然是由于 PostBack。但我想保持选择直到所有 DropDownLists 都被选中并将更改保存到数据库。任何帮助将不胜感激。

我的网格视图:

    <asp:GridView ID="CartList" runat="server" AutoGenerateColumns="False" ShowFooter="True" 
        GridLines="Vertical" CellPadding="4" CssClass="table table-striped table-bordered" 
        OnRowDataBound="CartList_RowDataBound">
        <Columns>
            <asp:BoundField DataField="ProductID" HeaderText="ID" SortExpression="ProductID" />
            <asp:BoundField DataField="Product.ProductName" HeaderText="Name" />
            <asp:BoundField DataField="Product.UnitPrice" HeaderText="Price (each)" DataFormatString="{0:c}" />
            <asp:TemplateField HeaderText="Quantity">
                <ItemTemplate>
                    <asp:TextBox ID="PurchaseQuantity" Width="40" runat="server" Text='<%# Eval("Quantity") %>'></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Size">
                <ItemTemplate>
                    <asp:DropDownList ID="Sizeddl" runat="server" Font-Size="Medium" 
                        AutoPostBack="true" ForeColor="Black" OnSelectedIndexChanged="Sizeddl_SelectedIndexChanged">
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Color">
                <ItemTemplate>
                    <asp:DropDownList ID="ColorNameddl" runat="server" 
                        Font-Size="Medium" ForeColor="Black">
                        </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Item Total">
                <ItemTemplate>
                    <%#: String.Format("{0:c}", ((Convert.ToDouble( Eval("Quantity") )) *  Convert.ToDouble(Eval("Product.UnitPrice"))))%>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Remove Item">
                <ItemTemplate>
                    <asp:CheckBox ID="Remove" runat="server"></asp:CheckBox>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <div>
        <p></p>
        <strong>
            <asp:Label ID="LabelSubtotal" runat="server" Text="SubTotal: "></asp:Label>
            <asp:Label ID="lblSubtotal" runat="server" EnableViewState="false"></asp:Label>
        </strong>
        <p></p>
        <strong>
            <asp:Label ID="LabelTax" runat="server" Text="Tax Total: "></asp:Label>
            <asp:Label ID="lblTax" runat="server" EnableViewState="false"></asp:Label>
        </strong>
        <p></p>
        <strong>
            <asp:Label ID="LabelTotalText" runat="server" Text="Order Total: "></asp:Label>
            <asp:Label ID="lblTotal" runat="server" EnableViewState="false"></asp:Label>
        </strong>
    </div>
    <br />
    <table>

网格视图加载:

        DataTable rstSize = new DataTable();
        protected void Page_Load(object sender, EventArgs e)
        {
            using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
            {
                decimal cartTotal = 0;
                cartTotal = usersShoppingCart.GetTotal();
                if (cartTotal > 0)
                {
                    // Display Total.
                    lblSubtotal.Text = String.Format("{0:c}", usersShoppingCart.GetSubtotal());
                    lblTax.Text = String.Format("{0:c}", usersShoppingCart.GetTax());
                    lblTotal.Text = String.Format("{0:c}", usersShoppingCart.GetTotal());
                }
                else
                {
                    lblSubtotal.Text = "";
                    lblTax.Text = "";
                    lblTotal.Text = "";
                    ShoppingCartTitle.InnerText = "Shopping Cart is Empty";
                    UpdateBtn.Visible = false;
                    CheckoutImageBtn.Visible = false;
                }
                if (!IsPostBack)
                {
                    LoadGrid();
                }
            }
        }
        void LoadGrid()
        {
            // Load Cart Items.
            using (ShoppingCartActions actions = new ShoppingCartActions())
            {
                var _db = new ProductContext();
                string cartId = actions.GetCartId();
                var cart = _db.ShoppingCartItems.Where(
                c => c.CartId == cartId).ToList();

                // Create DataTable for Colors
                rstSize.Columns.Add("SizeName", typeof(string));
                var row = rstSize.NewRow();
                row["SizeName"] = "S";
                row["SizeName"] = "M";
                row["SizeName"] = "L";
                row["SizeName"] = "XL";
                row["SizeName"] = "2XL";

                CartList.DataSource = cart;
                CartList.DataBind();

                // Hide DropDown Lists for rows that they are not needed for.
                for (int i = 0; i < CartList.Rows.Count; i++)
                {
                    DropDownList sizeDDL = CartList.Rows[i].FindControl("Sizeddl") as DropDownList;
                    DropDownList colorDDL = CartList.Rows[i].FindControl("ColorNameddl") as DropDownList;

                    IOrderedDictionary rowValues = new OrderedDictionary();
                    rowValues = GetValues(CartList.Rows[i]);
                    var _prodID = Convert.ToInt32(rowValues["ProductID"]);
                    var _prod = (from c in _db.Products
                                 where c.ProductID == _prodID
                                 select c.CategoryID).FirstOrDefault();
                    if (_prod != 1)
                    {
                        sizeDDL.Visible = false;
                        colorDDL.Visible = false;
                    }
                }

            }
        }

我的 RowDataBound:

        protected void CartList_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataRowView gData = (DataRowView)e.Row.DataItem;
                // Populate and select Color from DB.
                DropDownList sizeDDL = (DropDownList)e.Row.FindControl("Sizeddl");
                sizeDDL.DataSource = rstSize;
                sizeDDL.DataBind();
                sizeDDL.Items.Insert(0, new ListItem("Select Size", "0"));
                sizeDDL.SelectedValue = gData["SizeName"].ToString();

                // Load Color DDL
                var _size = sizeDDL.SelectedItem.Text;
                int _prod = Convert.ToInt32(e.Row.Cells[0].Text);
                var _db = new ProductContext();
                var qryColor = (from p in _db.ProductAttributes
                                join c in _db.Colors
                                on p.ColorID equals c.ColorID
                                where p.SizeName == _size & p.ProductID == _prod
                                select new { p.ColorID, c.ColorName }).Distinct().ToList();
                DropDownList colorDDL = (DropDownList)e.Row.FindControl("ColorNameddl");
                
                // Create DataTable for Colors
                DataTable rstColor = new DataTable();
                rstColor.Columns.Add("ColorID", typeof(int));
                rstColor.Columns.Add("ColorName", typeof(string));
                foreach(var item in qryColor)
                {
                    var row = rstColor.NewRow();
                    row["ColorID"] = item.ColorID;
                    row["ColorName"] = item.ColorName;
                    rstColor.Rows.Add(row);
                }

                // Bind Color Drop Down List to DataTable.
                colorDDL.DataSource = rstColor;
                colorDDL.DataBind();
                colorDDL.Items.Insert(0, new ListItem("Select Color", "0"));
                colorDDL.SelectedValue = gData["ColorName"].ToString();
            }
        }

我的 SelectedIndexChanged

        protected void Sizeddl_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList sizeDDL = (DropDownList)sender;
            GridViewRow gRow = (GridViewRow)sizeDDL.NamingContainer;

            string strSize = sizeDDL.SelectedItem.Text;
            DropDownList colorDDL = (DropDownList)gRow.FindControl("ColorNameddl");

            if (strSize != "Choose one")
            {
                using (ProductContext context = new ProductContext())
                {
                    int _prodID = Convert.ToInt32(gRow.Cells[0].Text);
                    var _size = sizeDDL.SelectedItem.Text;
                    var qryColor = (from p in context.ProductAttributes
                                    join c in context.Colors
                                    on p.ColorID equals c.ColorID
                                    where p.SizeName == _size & p.ProductID == _prodID
                                    select new { p.ColorID, c.ColorName }).Distinct().ToList();
                    if (qryColor.Count > 0)
                    {
                        colorDDL.DataSource = qryColor;
                        colorDDL.DataTextField = "ColorName";
                        colorDDL.DataValueField = "ColorID";
                        colorDDL.DataBind();
                        colorDDL.Items.Insert(0, new ListItem("Select Color", "0"));
                        colorDDL.Enabled = true;
                    }
                    else
                    {
                        colorDDL.Items.Clear();
                        colorDDL.Items.Insert(0, new ListItem("No Colors Available", "0"));
                        colorDDL.Enabled = false;
                    }
                }
            }
        }

if you make the selections on the first row

通过“selections”,我们是否假设进行更改 - 或者 select/change 组合框中的值,对吗?

I'd like to maintain the selection until all DropDownLists have been selected and I save the changes to the DB. Any help would be very appreciated.

网格视图将并且应该处理页面上的 post 背面。毕竟,即使在 GV 之外,任何旧按钮或控件都可能并且将会导致 post-backs.

用户没有理由更改任何网格行,包括下拉列表 (DDL) 应该很重要。并且对一行的操作不应影响对其他行的操作。 GV 所谓的“查看”状态是自动的,在大多数情况下您不必担心。

因此,完全不清楚您为什么 post 编辑“添加行”,因为所有这些问题都集中在编辑或更改当前行上。 (对我们来说,比如说下周或任何时候,我们可以查看或处理创建的行,但现在让我们专注于对给定行的更改,以及为什么出于某种原因您会在其他行中看到效果 - 您不应该看到这个。

榜首?

虽然控件 - 包括 GV 可以而且应该毫无问题地处理 post-backs?

如果 post-back 导致网格 re-bind,则情况并非如此。如果发生这种情况,那么您将遇到问题。

那么,榜首?

您遗漏了 how/when/where 您正在加载 GV。 (最重要的部分!!!!)。

下一个?

您不想也不需要在 GV 中显示行 PK id。这些数字不仅对最终用户没有任何意义,而且还存在安全风险 - PK 行号不需要显示,实际上甚至不需要包含在行标记中。我们可以再次将这个问题留到另一天,但您可以(并且应该考虑)使用 DataKeys 进行行 PK id 操作。我们假设数据库中没有重复的 PK row id,对吗?换句话说,请确保您的数据中有一个数据库行 PK“id”。

因此,您以后可以删除该 ProductID。 GV 有一个处理 PK 行 id 的特殊功能——我们应该使用它。 (数据键)

好的,既然我们清理了上面的内容?

在页面加载事件中,我们需要加载 GV,但仅在第一页加载时 - 之后,我们不能 re-load GV(再次绑定),否则您将丢失更改, 并编辑 GV.

此外,您可能需要考虑在底部添加一个保存按钮 - 以保存所有 gv 更改 - 而不是逐行执行此操作。 (但是,这里一次做一件事)。

所以首先,加载 GV 的代码应该在页面加载中。

接下来,该代码只能 运行 第一次。

例如:

if (!IsPostBack) 
{
    code here to load GV
}

下一个?当 GV 加载该数据时,您需要设置组合框和级联。而且,每行的这种设置应该发生在行数据绑定事件中。

所以,您的 posted 代码看起来没问题,但我们缺少 how/when 您加载 GV。

而且我们也没有看到您的保存按钮。但在这一点上,我会分享您加载 GV 的代码 - 这里缺少所有重要信息。

所以编辑你的问题 - 说明你如何以及何时加载网格 - 缺少。

另外,为什么这里使用行创建事件来设置事件?只需将事件存根和定义放在标记中即可。

您可以随意将飞机简按钮或 DDL 或其他任何东西放入 GV 中。你应该像所有其他控件一样连接事件。

因此,删除该行创建的事件存根 - 它可能会为错误的行连接事件 - 但它不是必需的,并且是一个高风险的冒险。

所以,就这样做:

那么,对于一个按钮,还是GV中的DDL?不能双击按钮(创建点击事件),也不能显示属性sheet添加事件。但是您可以在标记中只输入事件名称,点击“=”,然后注意上面的 intel-sense 是如何弹出一个创建事件的选项的。因此,以这种方式添加事件。在您 select 创建新事件后,您可以转到代码隐藏 - 您会看到新的事件存根,并将您的代码添加到该存根中。 GV 使用内部信息来连接每一行事件 - 你很可能把它搞砸了。

所以,我会删除您添加的行 - 因为我们没有关于该代码的详细信息,并且 how/when 您添加了一行,但是 100% 消除了行创建事件,并连接了一次点击事件将大大消除此处的任何问题 - 如果您的行添加事件“复制”控件,情况尤其如此 - 当您执行此操作时,您可能会复制 DDL 对象,这将再次导致问题。换句话说,您可能有两行相同的对象 - 对其中一行的更改会影响另一行。

所以,转储你的行添加事件,并按照上面的方法直接在 ddl 的标记中添加事件。

那么,对于每一行的按钮,还是其他什么?您仍然可以(并且应该)使用标记来添加这些事件 - 除非没有其他方法,否则不要编写代码这样做。

编辑:工作示例

所以,说这个标记:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ID" 
    CssClass="table"
    Width="30%" OnRowDataBound="GridView1_RowDataBound">

    <Columns>
        <asp:BoundField DataField="Firstname" HeaderText="Firstname" />
        <asp:BoundField DataField="LastName" HeaderText="LastName"  />
        <asp:TemplateField HeaderText="Select Hotel City">
            <ItemTemplate>
                <asp:DropDownList ID="cboCity" runat="server" Width="120px"  Height="26px"
                    DataTextField = "City"
                    DataValueField = "City"
                    AutoPostback="true" 
                    OnSelectedIndexChanged="cboCity_SelectedIndexChanged"
                    > 
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Select Hotel">
            <ItemTemplate>
                <asp:DropDownList ID="cboHotels" runat="server" Width="210px"  Height="26px"
                    DataValueField ="ID"
                    DataTextField ="HotelName">
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Nights"  >
            <ItemTemplate>
               <asp:TextBox ID="txtNights" runat="server" Style="text-align:right"
                   Text='<%# Eval("Nights") %>' Width="70px" >
               </asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

我们将级联城市组合以限制第二个组合中的酒店。

所以,我们要加载的代码:

    DataTable rstCity = new DataTable();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid ()
    {
        // load up City list for combo box - all rows (scope = page)
        SqlCommand cmdSQL = new SqlCommand("SELECT City from City ORDER BY City");
        rstCity = MyRstP(cmdSQL);

        // load up the grid
        cmdSQL.CommandText = "SELECT * from People ORDER BY FirstName"; 
        GridView1.DataSource = MyRstP(cmdSQL);
        GridView1.DataBind();
    }

我们有这个:

注意我们如何不冒险尝试在标记中设置 DDL - 因为我们级联 - 会有太多问题。

因此,我们当然绑定了行数据 - 并且设置了两个 DDL。 (我们设置级联并设置它们的值。

我们有这个:

   protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView gData = (DataRowView)e.Row.DataItem; // get the row data
            // load the city combo box
            DropDownList cboCity = (DropDownList)e.Row.FindControl("cboCity");
            cboCity.DataSource = rstCity;
            cboCity.DataBind();
            // add blank row for city
            cboCity.Items.Insert(0, new ListItem("Select City", ""));
            cboCity.SelectedValue = gData["City"].ToString();  // set value of Current city

            // now load Hotel combo box - but cascade from above City cbo
            string strSQL = @"Select ID, HotelName From tblHotels WHERE City = @City " +
                            " ORDER BY HotelName";
            SqlCommand cmdSQL = new SqlCommand(strSQL);
            cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = gData["HotelCity"].ToString();

            DropDownList cboHotels = (DropDownList)e.Row.FindControl("cboHotels");
            DataTable rstHotels = MyRstP(cmdSQL);
            cboHotels.DataSource = rstHotels;
            cboHotels.DataBind();
            cboHotels.Items.Insert(0, new ListItem("Select Hotel", ""));
            // set hotels combo to current selected
            cboHotels.SelectedValue = gData["Hotel_id"].ToString();
        }
    }

所以,唯一剩下的部分是第一个DDL post-back和级联代码。我们有这个:

    protected void cboCity_SelectedIndexChanged(object sender, EventArgs e)
    {
        // city changed, so cascade Hotel cbo
        DropDownList cboCity = (DropDownList)sender;

        GridViewRow gRow = (GridViewRow)cboCity.NamingContainer;

        // filter hotels to current city
        string strCity = cboCity.SelectedItem.Text;
        DropDownList cboHotels = (DropDownList)gRow.FindControl("cboHotels");

        if (strCity != "Select City")
        {
            SqlCommand cmdSQL = new 
                SqlCommand(@"SELECT * from tblHotels WHERE City  = @City ORDER BY HotelName");
            cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = strCity;                
            cboHotels.DataSource = MyRstP(cmdSQL);
            cboHotels.DataBind();
            cboHotels.Items.Insert(0, new ListItem("Select Hotel", ""));
        }
    }

所以,有了以上?我看不出某些“其他”行如何可能在这里受到影响(除非您有一些其他代码试图弄乱这些行,或者将一行插入 GV。如果您要插入一行,然后在数据库级别插入 - 和 re-bind GV。但是,插入是一个单独的问题。

这是第二个下拉菜单现在可以正常运行的更新。但是,当您单击更新按钮时,它会正确保存到数据库,但会重置并清除第二个下拉列表。

标记:

 <asp:GridView ID="CartList" runat="server" AutoGenerateColumns="False" ShowFooter="True" GridLines="Vertical" CellPadding="4"
        ItemType="GetAGrip.Models.CartItem" CssClass="table table-striped table-bordered"
        EnableViewState="true">
        <Columns>
            <asp:BoundField DataField="ProductID" HeaderText="ID" SortExpression="ProductID" />
            <asp:BoundField DataField="Product.ProductName" HeaderText="Name" />
            <asp:BoundField DataField="Product.UnitPrice" HeaderText="Price (each)" DataFormatString="{0:c}" />
            <asp:TemplateField HeaderText="Quantity">
                <ItemTemplate>
                    <asp:TextBox ID="PurchaseQuantity" Width="40" runat="server" Text="<%#: Item.Quantity %>"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Size">
                <ItemTemplate>
                    <asp:DropDownList ID="Sizeddl" runat="server" Font-Size="Medium" OnSelectedIndexChanged="Sizeddl_SelectedIndexChanged"
                        AutoPostBack="true" ForeColor="Black" SelectedValue="<%#: Item.SizeName %>">
                        <asp:ListItem Selected="True" Text="Choose one" Value="0"></asp:ListItem>
                        <asp:ListItem Text="S" Value="S"></asp:ListItem>
                        <asp:ListItem Text="M" Value="M"></asp:ListItem>
                        <asp:ListItem Text="L" Value="L"></asp:ListItem>
                        <asp:ListItem Text="XL" Value="XL"></asp:ListItem>
                        <asp:ListItem Text="2XL" Value="2XL"></asp:ListItem>
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Color">
                <ItemTemplate>
                    <asp:DropDownList ID="ColorNameddl" runat="server" Font-Size="Medium" ForeColor="Black">
                    </asp:DropDownList>
                    <asp:Label ID="Templbl" runat="server" Visible="false" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Item Total">
                <ItemTemplate>
                    <%#: String.Format("{0:c}", ((Convert.ToDouble(Item.Quantity)) *  Convert.ToDouble(Item.Product.UnitPrice)))%>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Remove Item">
                <ItemTemplate>
                    <asp:CheckBox ID="Remove" runat="server"></asp:CheckBox>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

    <div>
        <p></p>
        <strong>
            <asp:Label ID="LabelSubtotal" runat="server" Text="SubTotal: "></asp:Label>
            <asp:Label ID="lblSubtotal" runat="server" EnableViewState="false"></asp:Label>
        </strong>
        <p></p>
        <strong>
            <asp:Label ID="LabelTax" runat="server" Text="Tax Total: "></asp:Label>
            <asp:Label ID="lblTax" runat="server" EnableViewState="false"></asp:Label>
        </strong>
        <p></p>
        <strong>
            <asp:Label ID="LabelTotalText" runat="server" Text="Order Total: "></asp:Label>
            <asp:Label ID="lblTotal" runat="server" EnableViewState="false"></asp:Label>
        </strong>
    </div>
    <br />
    <table>
        <tr>
            <td>
                <asp:Button ID="UpdateBtn" runat="server" Text="Update" OnClick="UpdateBtn_Click" Visible="false" Enabled="false"/>
            </td>
            <th colspan="1">&nbsp
            </th>
            <td>
                <asp:ImageButton ID="CheckoutImageBtn" runat="server"
                    ImageUrl="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"
                    Width="145" AlternateText="Check out with PayPal"
                    OnClick="CheckoutBtn_Click"
                    BackColor="Transparent" BorderWidth="0" />
            </td>
        </tr>
    </table>

Page_Load

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadGrid();
            }

            using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
            {
                decimal cartTotal = 0;
                cartTotal = usersShoppingCart.GetTotal();
                if (cartTotal > 0)
                {
                    // Display Total.
                    lblSubtotal.Text = String.Format("{0:c}", usersShoppingCart.GetSubtotal());
                    lblTax.Text = String.Format("{0:c}", usersShoppingCart.GetTax());
                    lblTotal.Text = String.Format("{0:c}", usersShoppingCart.GetTotal());
                }
                else
                {
                    lblSubtotal.Text = "";
                    lblTax.Text = "";
                    lblTotal.Text = "";
                    ShoppingCartTitle.InnerText = "Shopping Cart is Empty";
                    UpdateBtn.Visible = false;
                    CheckoutImageBtn.Visible = false;
                }
            }
        }

加载网格、加载第二个下拉列表并在不应出现的行上隐藏 DDL:

        void LoadGrid()
        {
            GetShoppingCartItems();
            CartList.DataSource = GetShoppingCartItems();
            CartList.DataBind();

            var _db = new ProductContext();
            for (int i = 0; i < CartList.Rows.Count; i++)
            {
                DropDownList sizeDDL = CartList.Rows[i].FindControl("Sizeddl") as DropDownList;
                DropDownList colorDDL = CartList.Rows[i].FindControl("ColorNameddl") as DropDownList;

                var _colors = (from c in _db.Colors
                               select c.ColorName).Distinct().ToList();
                colorDDL.DataSource = _colors;
                colorDDL.DataBind();
                colorDDL.Items.Insert(0, new ListItem("Select Color", "0"));
                colorDDL.SelectedIndex = 0;
                foreach (ListItem item in colorDDL.Items)
                {
                    item.Attributes.Add("disabled", "disabled");
                }

                IOrderedDictionary rowValues = new OrderedDictionary();
                rowValues = GetValues(CartList.Rows[i]);
                var _prodID = Convert.ToInt32(rowValues["ProductID"]);
                var _prod = (from c in _db.Products
                             where c.ProductID == _prodID
                             select c.CategoryID).FirstOrDefault();
                if (_prod != 1)
                {
                    sizeDDL.Visible = false;
                    colorDDL.Visible = false;
                }
            }

        }

GetShoppingCartItems 方法:

        public List<CartItem> GetShoppingCartItems()
        {
            ShoppingCartActions actions = new ShoppingCartActions();
            return actions.GetCartItems();
        }

UpdateCartItems 方法

        public List<CartItem> UpdateCartItems()
        {
            using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
            {
                String cartId = usersShoppingCart.GetCartId();

                ShoppingCartActions.ShoppingCartUpdates[] cartUpdates = new ShoppingCartActions.ShoppingCartUpdates[CartList.Rows.Count];
                for (int i = 0; i < CartList.Rows.Count; i++)
                {
                    IOrderedDictionary rowValues = new OrderedDictionary();
                    rowValues = GetValues(CartList.Rows[i]);
                    cartUpdates[i].ProductId = Convert.ToInt32(rowValues["ProductID"]);

                    CheckBox cbRemove = new CheckBox();
                    cbRemove = (CheckBox)CartList.Rows[i].FindControl("Remove");
                    cartUpdates[i].RemoveItem = cbRemove.Checked;

                    TextBox quantityTextBox = new TextBox();
                    quantityTextBox = (TextBox)CartList.Rows[i].FindControl("PurchaseQuantity");
                    cartUpdates[i].PurchaseQuantity = Convert.ToInt16(quantityTextBox.Text.ToString());

                    DropDownList sizeDropDown = new DropDownList();
                    sizeDropDown = (DropDownList)CartList.Rows[i].FindControl("Sizeddl");
                    cartUpdates[i].SizeName = sizeDropDown.Text;

                    DropDownList colorDropDown = new DropDownList();
                    colorDropDown = (DropDownList)CartList.Rows[i].FindControl("ColorNameddl");
                    cartUpdates[i].ColorName = colorDropDown.Text;

                }
                usersShoppingCart.UpdateShoppingCartDatabase(cartId, cartUpdates);
                CartList.DataBind();
                lblSubtotal.Text = String.Format("{0:c}", usersShoppingCart.GetSubtotal());
                lblTax.Text = String.Format("{0:c}", usersShoppingCart.GetTax());
                lblTotal.Text = String.Format("{0:c}", usersShoppingCart.GetTotal());
                return usersShoppingCart.GetCartItems();
            }
        }

获取值字典

        public static IOrderedDictionary GetValues(GridViewRow row)
        {
            IOrderedDictionary values = new OrderedDictionary();
            foreach (DataControlFieldCell cell in row.Cells)
            {
                if (cell.Visible)
                {
                    // Extract values from the cell.
                    cell.ContainingField.ExtractValuesFromCell(values, cell, row.RowState, true);
                }
            }
            return values;
        }

点击更新按钮

        protected void UpdateBtn_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < CartList.Rows.Count; i++)
            {
                UpdateCartItems();
            }
            Page.Response.Redirect(Page.Request.Url.ToString(), true);
        }

RowDataBound

        protected void CartList_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataRowView gData = (DataRowView)e.Row.DataItem;  // get row data.
                // load the color Drop Down List.
                DropDownList sizeDDL = (DropDownList)e.Row.FindControl("Sizeddl");

                sizeDDL.SelectedValue = gData["SizeName"].ToString();

                //// Load Color DDL
                var _size = sizeDDL.SelectedItem.Text;
                int _prod = Convert.ToInt32(e.Row.Cells[0].Text);
                var _db = new ProductContext();
                var qryColor = (from p in _db.ProductAttributes
                                join c in _db.Colors
                                on p.ColorID equals c.ColorID
                                where p.SizeName == _size & p.ProductID == _prod
                                select new { p.ColorID, c.ColorName }).Distinct().ToList();

                DropDownList colorDDL = (DropDownList)e.Row.FindControl("ColorNameddl");

                // Bind Color Drop Down List to DataTable.
                foreach (ListItem item in colorDDL.Items)
                {
                    if (qryColor.Any(c => c.ColorName == item.ToString()))
                    {
                        item.Enabled = true;
                    }
                }
                colorDDL.SelectedValue = gData["ColorName"].ToString();
            }
        }

第一个下拉 SelectedIndexChanged

        protected void Sizeddl_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList sizeDDL = (DropDownList)sender;
            GridViewRow gRow = (GridViewRow)sizeDDL.NamingContainer;

            string strSize = sizeDDL.SelectedItem.Text;
            DropDownList colorDDL = (DropDownList)gRow.FindControl("ColorNameddl");

            if (strSize != "Choose one")
            {
                using (ProductContext context = new ProductContext())
                {
                    int _prodID = Convert.ToInt32(gRow.Cells[0].Text);
                    var _size = sizeDDL.SelectedItem.Text;
                    var qryColor = (from p in context.ProductAttributes
                                    join c in context.Colors
                                    on p.ColorID equals c.ColorID
                                    where p.SizeName == _size & p.ProductID == _prodID
                                    select new { p.ColorID, c.ColorName }).Distinct().ToList();

                    if (qryColor.Count > 0)
                    {
                        foreach (ListItem item in colorDDL.Items)
                        {
                            if (qryColor.Any(c => c.ColorName == item.ToString()))
                            {
                                item.Enabled = true;
                            }
                            else
                            {
                                item.Enabled = false;
                            }
                        }
                        colorDDL.Items[0].Enabled = true;
                        colorDDL.Enabled = true;
                        colorDDL.SelectedIndex = 0;
                    }
                    else
                    {
                        colorDDL.SelectedIndex = 0;
                        colorDDL.Enabled = false;
                    }
                }
            }
        }

任何你看到上面没有的方法,那是因为它是我的逻辑文件中的一个方法,用于处理整个应用程序的数据库查询。