如何在gridview中保留下拉列表的值



我目前正在做一个关于为中小型公司生成发票的项目。

我有三个下拉列表(DDL)。

第一个下拉列表(产品类别)已经设置为4个列表项,即地毯,家具等

在从第一个DDL中选择后,第二个下拉列表(Product Type)将从数据库中检索与第一个DDL中所选值匹配的数据。

同样,在从第二个DDL中进行选择时,第三个下拉列表(Product ID)将从数据库中检索与第二个DDL中所选值匹配的数据。

第三,在从第三个DDL中进行选择时,文本框(Product Description, Unit Price)将填充从数据库中检索到的与第三个DDL中所选值匹配的数据。

现在,问题是当我点击一个按钮"添加新行",每次点击动态添加新行,在第二和第三DDL中选择的值不再存在,但在文本框中的值仍然存在。

有人可以帮助我如何保留第二和第三DDL的值,即使是用户点击按钮"添加新行",因为他/她想要的?

下面是我到目前为止完成的完整代码。

GenInvoice.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage/AdminLogin.master" AutoEventWireup="true" CodeFile="GenInvoice.aspx.cs" Inherits="GenInvoice" %>

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowFooter="true">
    <Columns>
        <asp:BoundField DataField="Row Number" HeaderText="Row Number" />
        <asp:TemplateField HeaderText="Category"> 
            <ItemTemplate>
                <asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged">
                    <asp:ListItem>Please Select</asp:ListItem>
                    <asp:ListItem>Carpets</asp:ListItem>
                    <asp:ListItem>Electrical Appliances</asp:ListItem>
                    <asp:ListItem>Furnitures</asp:ListItem>
                    <asp:ListItem>Others</asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Type"> 
            <ItemTemplate>
                <asp:DropDownList ID="ddlType" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlType_SelectedIndexChanged"> 
                    <asp:ListItem>Please Select</asp:ListItem>
                    </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Model No" > 
            <ItemTemplate>
                <asp:DropDownList ID="ddlModelNo" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlModelNo_SelectedIndexChanged" >
                    <asp:ListItem>Please Select</asp:ListItem>
                    </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Product Description"> 
            <ItemTemplate>
                <asp:Label ID="lblDescription" runat="server"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Quantity"> 
            <ItemTemplate>
                <asp:TextBox ID="txtQuantity" runat="server" AutoPostBack="false" OnTextChanged="txtQuantity_TextChanged" ></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Unit Price"> 
            <ItemTemplate>
                <asp:TextBox ID="txtUPrice" runat="server" AutoPostBack="true"></asp:TextBox>
            </ItemTemplate>
             <FooterTemplate>
                <asp:Label ID="lblGTotal" runat="server">Grand Total :</asp:Label>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Sub - Total"> 
            <ItemTemplate>
                <asp:TextBox ID="txtSTotal" runat="server"></asp:TextBox>
            </ItemTemplate>
           <FooterTemplate>
                <asp:TextBox ID="txtGTotal" runat="server"></asp:TextBox>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <FooterStyle />
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:Button ID="btnAddNewRow" runat="server" Text="Add New Row" OnClick="btnAddNewRow_Click" />

,

GenInvoice.aspx.cs

public partial class GenInvoice : System.Web.UI.Page
{
    private double subTotal = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        //GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
        if (!Page.IsPostBack)
        {
            SetInitialRow();
        }
    }
    private void SetInitialRow()
    {
        DataTable dt = new DataTable();
        DataRow dr = null;
        //dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
        dt.Columns.Add(new DataColumn("Row Number", typeof(string)));
        dt.Columns.Add(new DataColumn("Category", typeof(string)));
        dt.Columns.Add(new DataColumn("Type", typeof(string)));
        dt.Columns.Add(new DataColumn("Model No", typeof(string)));
        dt.Columns.Add(new DataColumn("Description", typeof(string)));
        dt.Columns.Add(new DataColumn("Quantity", typeof(string)));
        dt.Columns.Add(new DataColumn("Unit Price", typeof(string)));
        dt.Columns.Add(new DataColumn("Sub-Total", typeof(string)));
        dr = dt.NewRow();
        dr["Row Number"] = 1;
        dr["Category"] = string.Empty;
        dr["Type"] = string.Empty;
        dr["Model No"] = string.Empty;
        dr["Description"] = string.Empty;
        dr["Quantity"] = string.Empty;
        dr["Unit Price"] = string.Empty;
        dr["Sub-Total"] = string.Empty;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        //Store the DataTable in ViewState
        ViewState["CurrentTable"] = dt;
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }
    private void AddNewRowToGrid()
    {
        int rowIndex = 0;
        if (ViewState["CurrentTable"] != null)
        {
            DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
            DataRow drCurrentRow = null;
            if (dtCurrentTable.Rows.Count > 0)
            {
                for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                {
                    //extract the TextBox values
                    //TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
                    //TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2");
                    //DropDownList ddlProductType = (DropDownList)Gridview1.Rows[rowIndex].Cells[2].FindControl("ddlProductType");
                    DropDownList ddlCategory = (DropDownList)GridView1.Rows[rowIndex].Cells[1].FindControl("ddlCategory");
                    DropDownList ddlType = (DropDownList)GridView1.Rows[rowIndex].Cells[2].FindControl("ddlType");
                    DropDownList ddlModelNo = (DropDownList)GridView1.Rows[rowIndex].Cells[3].FindControl("ddlModelNo");
                    Label lblDescription = (Label)GridView1.Rows[rowIndex].Cells[4].FindControl("lblDescription");
                    TextBox txtQuantity = (TextBox)GridView1.Rows[rowIndex].Cells[5].FindControl("txtQuantity");
                    TextBox txtUPrice = (TextBox)GridView1.Rows[rowIndex].Cells[6].FindControl("txtUPrice");
                    TextBox txtSTotal = (TextBox)GridView1.Rows[rowIndex].Cells[7].FindControl("txtSTotal");

                    drCurrentRow = dtCurrentTable.NewRow();
                    drCurrentRow["Row Number"] = i + 1;
                    //dtCurrentTable.Rows[i - 1]["Category"] = box1.Text;
                    dtCurrentTable.Rows[i - 1]["Category"] = ddlCategory.Text;
                    dtCurrentTable.Rows[i - 1]["Type"] = ddlType.Text;
                    dtCurrentTable.Rows[i - 1]["Model No"] = ddlModelNo.Text;
                    dtCurrentTable.Rows[i - 1]["Description"] = lblDescription.Text;
                    dtCurrentTable.Rows[i - 1]["Quantity"] = txtQuantity.Text;
                    dtCurrentTable.Rows[i - 1]["Unit Price"] = txtUPrice.Text;
                    dtCurrentTable.Rows[i - 1]["Sub-Total"] = txtSTotal.Text;
                    rowIndex++;
                }
                dtCurrentTable.Rows.Add(drCurrentRow);
                ViewState["CurrentTable"] = dtCurrentTable;
                GridView1.DataSource = dtCurrentTable;
                GridView1.DataBind();
            }
        }
        else
        {
            Response.Write("ViewState is null");
        }
        //Set Previous Data on Postbacks
        SetPreviousData();
    }
    private void SetPreviousData()
    {
        int rowIndex = 0;
        if (ViewState["CurrentTable"] != null)
        {
            DataTable dt = (DataTable)ViewState["CurrentTable"];
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
                    //TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2");
                    //DropDownList ddlProductType = (DropDownList)Gridview1.Rows[rowIndex].Cells[2].FindControl("ddlProductType");
                    DropDownList ddlCategory = (DropDownList)GridView1.Rows[rowIndex].Cells[1].FindControl("ddlCategory");
                    DropDownList ddlType = (DropDownList)GridView1.Rows[rowIndex].Cells[2].FindControl("ddlType");
                    DropDownList ddlModelNo = (DropDownList)GridView1.Rows[rowIndex].Cells[3].FindControl("ddlModelNo");
                    Label lblDescription = (Label)GridView1.Rows[rowIndex].Cells[4].FindControl("lblDescription");
                    TextBox txtQuantity = (TextBox)GridView1.Rows[rowIndex].Cells[5].FindControl("txtQuantity");
                    TextBox txtUPrice = (TextBox)GridView1.Rows[rowIndex].Cells[6].FindControl("txtUPrice");
                    TextBox txtSTotal = (TextBox)GridView1.Rows[rowIndex].Cells[7].FindControl("txtSTotal");

                    ddlCategory.Text = dt.Rows[i]["Category"].ToString();
                    ddlType.Text = dt.Rows[i]["Type"].ToString();
                    ddlModelNo.Text = dt.Rows[i]["Model No"].ToString();
                    lblDescription.Text = dt.Rows[i]["Description"].ToString();
                    txtQuantity.Text = dt.Rows[i]["Quantity"].ToString();
                    txtUPrice.Text = dt.Rows[i]["Unit Price"].ToString();
                    txtSTotal.Text = dt.Rows[i]["Sub-Total"].ToString();
                    rowIndex++;
                }
            }
        }
    }
    protected void btnAddNewRow_Click(object sender, EventArgs e)
    {
        AddNewRowToGrid();
    }
    private void Calc()
    {
        double grandtotal = 0.0;
        foreach (GridViewRow dr in GridView1.Rows)
        {
            double price = Convert.ToDouble(((TextBox)dr.FindControl("txtUPrice")).Text);
            //double price = double.Parse(((TextBox)dr.FindControl("txtUPrice")).Text);
            int qty = int.Parse(((TextBox)dr.FindControl("txtQuantity")).Text);
            //Calculates Sub-Total
            double total = price * qty;
            //Displays Sub-Total
            ((TextBox)dr.FindControl("txtSTotal")).Text = Convert.ToString(total);
            //Calculates GrandTotal
            grandtotal = grandtotal + total;
        }
        //Displays Grand Total
        GridViewRow row = GridView1.FooterRow;
        ((TextBox)row.FindControl("txtGTotal")).Text = Convert.ToString(grandtotal);
    }

    protected void ddlType_SelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow dr in GridView1.Rows)
        {
            //string type = Convert.ToString(((DropDownList)dr.FindControl("ddlType")).Text);
            DropDownList ddlType = (DropDownList)dr.FindControl("ddlType");
            DropDownList ddlModelNo = (DropDownList)dr.FindControl("ddlModelNo");
            //ddlModelNo.Items.Clear();
            //if (type == "Cupboard")
            //{
            MySqlConnection con = new MySqlConnection("server=localhost;userid=root;password=;database=obsystem");
            con.Open();
            //MySqlCommand cmd = new MySqlCommand("SELECT productID FROM product WHERE productType='" + typeCupboard + "'", con);
            MySqlCommand cmd2 = new MySqlCommand("SELECT productID FROM product WHERE productType='" + ddlType.SelectedValue + "'", con);
            MySqlDataAdapter da1 = new MySqlDataAdapter(cmd2);
            DataSet ds1 = new DataSet();
            da1.Fill(ds1);
            ddlModelNo.DataSource = ds1;
            ddlModelNo.DataValueField = "productID";
            ddlModelNo.DataTextField = "productID";
            ddlModelNo.DataBind();
            ddlModelNo.Items.Insert(0, new ListItem("Please Select", "Please Select"));
            Session["ddlTypeValue"] = ddlType.SelectedValue;
        }
    }
    protected void ddlCategory_SelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow dr in GridView1.Rows)
        {
            //string type = Convert.ToString(((DropDownList)dr.FindControl("ddlType")).Text);
            DropDownList ddlCat = (DropDownList)dr.FindControl("ddlCategory");
            //DropDownList ddlModelNo = (DropDownList)dr.FindControl("ddlModelNo");
            Session["ddlCat"] = ddlCat.SelectedValue;

            string category = Convert.ToString(((DropDownList)dr.FindControl("ddlCategory")).Text);
            if (category == "Carpets")
            {
                DropDownList ddlType = (DropDownList)dr.FindControl("ddlType");

                MySqlConnection con = new MySqlConnection("server=localhost;userid=root;password=;database=obsystem");
                con.Open();
                MySqlCommand cmd = new MySqlCommand("SELECT carpets FROM producttypecarpets", con);
                MySqlDataAdapter da = new MySqlDataAdapter(cmd);
                //MySqlDataReader dz = cmd.ExecuteReader();
                DataSet ds = new DataSet();
                da.Fill(ds);
                ddlType.DataSource = ds;
                ddlType.DataValueField = "carpets";
                ddlType.DataTextField = "carpets";
                ddlType.DataBind();
                ddlType.Items.Insert(0, new ListItem("Please Select", "Please Select"));
            }
            if (category == "Electrical Appliances")
            {
                DropDownList ddlType = (DropDownList)dr.FindControl("ddlType");
                MySqlConnection con = new MySqlConnection("server=localhost;userid=root;password=;database=obsystem");
                con.Open();
                MySqlCommand cmd = new MySqlCommand("SELECT electrical FROM producttypeelectrical", con);
                MySqlDataAdapter da = new MySqlDataAdapter(cmd);
                //MySqlDataReader dz = cmd.ExecuteReader();
                DataSet ds = new DataSet();
                da.Fill(ds);
                ddlType.DataSource = ds;
                ddlType.DataValueField = "electrical";
                ddlType.DataTextField = "electrical";
                ddlType.DataBind();
                ddlType.Items.Insert(0, new ListItem("Please Select", "Please Select"));
            }
            if (category == "Furnitures")
            {
                DropDownList ddlCategory = (DropDownList)dr.FindControl("ddlCategory");
                DropDownList ddlType = (DropDownList)dr.FindControl("ddlType");

                //DropDownList ddlModelNo = (DropDownList)dr.FindControl("ddlModelNo");
                //Label lblDescription = (Label)dr.FindControl("lblDescription");
                //TextBox txtUPrice = (TextBox)dr.FindControl("txtUPrice");
                //string catFurnitures = "Furnitures";
                MySqlConnection con = new MySqlConnection("server=localhost;userid=root;password=;database=obsystem");
                con.Open();
                MySqlCommand cmd = new MySqlCommand("SELECT DISTINCT productType FROM product WHERE productCategory='" + ddlCategory.SelectedValue + "'", con);
                MySqlDataAdapter da = new MySqlDataAdapter(cmd);
                //MySqlDataReader dz = cmd.ExecuteReader();
                DataSet ds = new DataSet();
                da.Fill(ds);
                ddlType.DataSource = ds;
                ddlType.DataValueField = "productType";
                ddlType.DataTextField = "productType";
                ddlType.DataBind();
                ddlType.Items.Insert(0, new ListItem("Please Select", "Please Select"));
            }
            //if (category == "Others")
            //Type();
            //GridView1.DataBind();
        }
    }
    protected void ddlModelNo_SelectedIndexChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow dr in GridView1.Rows)
        {
            string type = Convert.ToString(((DropDownList)dr.FindControl("ddlType")).Text);
            DropDownList ddlType = (DropDownList)dr.FindControl("ddlType");
            DropDownList ddlModelNo = (DropDownList)dr.FindControl("ddlModelNo");
           Label lblDescription = (Label)dr.FindControl("lblDescription");
            TextBox txtUPrice = (TextBox)dr.FindControl("txtUPrice");
            //if (type == "Cupboard")
            //{
            MySqlConnection con = new MySqlConnection("server=localhost;userid=root;password=;database=obsystem");
            con.Open();
            //MySqlCommand cmd = new MySqlCommand("SELECT productID FROM product WHERE productType='" + typeCupboard + "'", con);
            MySqlCommand cmd2 = new MySqlCommand("SELECT productDesc,productSellingPrice FROM product WHERE productID='" + ddlModelNo.SelectedValue + "'", con);
            MySqlDataAdapter da1 = new MySqlDataAdapter(cmd2);
            MySqlDataReader myDataReader = cmd2.ExecuteReader();

            while (myDataReader.Read())
            {
                //ddlCompanyName.Items.Add(dr["compName"].ToString());
                lblDescription.Text = myDataReader["productDesc"].ToString();
                txtUPrice.Text = myDataReader["productSellingPrice"].ToString();
            }

            DataSet ds1 = new DataSet();
            da1.Fill(ds1);
            ddlModelNo.DataSource = ds1;
            ddlModelNo.DataValueField = "productID";
            ddlModelNo.DataTextField = "productID";
            ddlModelNo.DataBind();
        }
    }
    protected void txtQuantity_TextChanged(object sender, EventArgs e)
    {
        Calc();
    }
}

当我浏览你的代码时,我注意到你写了以下内容

ddlCategory.Text = dt.Rows[i]["Category"].ToString();
                    ddlType.Text = dt.Rows[i]["Type"].ToString();
                    ddlModelNo.Text = dt.Rows[i]["Model No"].ToString();

实际上应该是这样的

fillCategory();
if(ddlCategory.items.contains(ddlCategory.items.FindByText(dt.Rows[i]["Category"].ToString())))
{
ddlCategory.clearselection(); 
ddlCategory.items.FindByText(dt.Rows[i]["Category"].ToString()).Selected=True;
}
  fillType(); 
if(ddlType.items.contains(ddlType.items.FindByText(dt.Rows[i]["Type"].ToString())))
{
ddlType.clearselection(); 
ddlType.items.FindByText(dt.Rows[i]["Type"].ToString()).Selected=True;
}    
fillModel();
if(ddlModelNo.items.contains(ddlModelNo.items.FindByText(dt.Rows[i]["Model No"].ToString())))
{
ddlModelNo.clearselection(); 
ddlModelNo.items.FindByText(dt.Rows[i]["Model No"].ToString()).Selected=True;
}    

你必须先填充下拉框,然后才选择它。

告诉我你是否得到了答案

相关内容

  • 没有找到相关文章

最新更新