none
C# listbox內的值相加 RRS feed

  • 一般討論

  • 做完後發現listBox內複選的值無法相加

    namespace _106406027
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            String[] deskpc = new string[] { "華爍主機", "碁峰主機", "技佳主機", "津英主機" };
            int[] deskpcprice = new int [] { 20000, 18000, 15000, 12000 };
            String[] CRT = new string[] { "15吋", "17吋", "19吋" };
            int[] CRTprice = new int[] { 4000, 5000, 6000 };
            String[] BOX = new string[] { "滑鼠", "鍵盤", "IG隨身碟", "DVD燒錄機" };
            int[] BOXprice = new int[] { 300, 400, 500, 800 };
            private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 0; i <= deskpc.GetUpperBound(0); i++)
                {
                    lsdeskpc.Items.Add(deskpc[i] + "(" + Convert.ToString(deskpcprice[i]) + ")");
                }
                lsdeskpc.SelectedIndex = 0;
                for (int i = 0; i <= CRT.GetUpperBound(0); i++)
                {
                    cbxCRT.Items.Add(CRT[i] + "(" + Convert.ToString(CRTprice[i]) + ")");
                }
                cbxCRT.SelectedIndex = 0;
                for (int i = 0; i <= BOX.GetUpperBound(0); i++)
                {
                    listBox.Items.Add(BOX[i] + "(" + Convert.ToString(BOXprice[i]) + ")");
                }
                listBox.SelectedIndex = 0;
            }

            private void lsdeskpc_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    int sum = deskpcprice[lsdeskpc.SelectedIndex] + CRTprice[cbxCRT.SelectedIndex] + BOXprice[listBox.SelectedIndex];
                    lblsum.Text = "合計:" + Convert.ToString(sum);
                }
                catch { }
            }

            private void cbxCRT_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    int sum = deskpcprice[lsdeskpc.SelectedIndex] + CRTprice[cbxCRT.SelectedIndex] + BOXprice[listBox.SelectedIndex];
                    lblsum.Text = "合計:" + Convert.ToString(sum);
                }
                catch { }
            }

            private void listBox_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    int sum = deskpcprice[lsdeskpc.SelectedIndex] + CRTprice[cbxCRT.SelectedIndex] + BOXprice[listBox.SelectedIndex] ;
                    lblsum.Text = "合計:" + Convert.ToString(sum);
                }
                catch { }
            }
        }
    }

    2018年3月14日 下午 01:54

所有回覆

  • 有幾個建議
    (1) 通常會設定一個類別將品名和價格包在一起
    (2) 使用 ListBox.DataSource 屬性繫結資料來源,指派其 DisplayMember(顯示在畫面的選單內容)以及 ValueMember(使用 SelectedValue 即可取得被選擇的選項的值內容);而非使用 Items.Add 方法將項目加入 ListBox。Combobox 同理。

    依照上述,首先建立一個類別叫做 Product

       class Product
        {
            /// <summary>
            /// 品名
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 價格
            /// </summary>
            public int Price { get; set; }
        }

    接著,建立一個類別用來產生資料

     class ProductsCreator
        {
            public static List<Product> GetDesktops()
            {
                return new List<Product>()
                {
                    new Product () { Name = "華爍主機", Price =20000},
                    new Product () { Name = "碁峰主機", Price =18000},
                    new Product () { Name = "技佳主機", Price =15000},
                    new Product () { Name = "津英主機", Price =12000},
    
                };      
            }
    
            public static List<Product> GetCRTs()
            {
                return new List<Product>()
                {
                    new Product () { Name = "15吋", Price =4000},
                    new Product () { Name = "17吋", Price =5000},
                    new Product () { Name = "19吋", Price =6000},
                };
            }
    
            public static List<Product> GetPeripherals()
            {
                return new List<Product>()
                {
                    new Product () { Name = "滑鼠", Price =300},
                    new Product () { Name = "鍵盤", Price =400},
                    new Product () { Name = "1G隨身碟", Price =500},
                    new Product () { Name = "DVD燒錄機", Price =800},
                };
            }
        }
    最後完成 Form 的程式碼
      public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                BindingData();
            }
    
            private void BindingData()
            {
    
                SetListControlMembers(lsdeskpc, ProductsCreator.GetDesktops());
                SetListControlMembers(cbxCRT, ProductsCreator.GetCRTs());
                SetListControlMembers(listBox, ProductsCreator.GetPeripherals());
    
            }
    
            /// <summary>
            /// 因為 Combobox 和 ListBox 的父類別都是 ListControl
            /// 而且 DisplayMember 和 ValueMember 都是繼承自 ListControl
            /// </summary>
            /// <param name="control"></param>
            private void SetListControlMembers(ListControl control, List<Product> data)
            {
                
                control.DataSource = data;
                control.DisplayMember = "Name";
                control.ValueMember = "Price";
                control.SelectedValueChanged += Control_SelectedValueChanged;
            }
    
            private void Control_SelectedValueChanged(object sender, EventArgs e)
            {
                int sum = (int)lsdeskpc.SelectedValue + (int)cbxCRT.SelectedValue + (int)listBox.SelectedValue;
                lblsum.Text = string.Format("合計 : {0}", sum);
            }
    
           
        }

    另外提醒一下,發文的編輯器上方有個程式碼編輯器區塊的功能,用此功能貼程式碼會比較好看。








    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2018年3月14日 下午 03:25
    版主
  • 剛忽略了 "複選值" 的問題。

    假設你要複選的是 "周邊" 那一塊,那程式碼要改成這樣

      public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                listBox.SelectionMode = SelectionMode.MultiExtended;
                BindingData();
            }
    
            private void BindingData()
            {
               
                SetListControlMembers(lsdeskpc, ProductsCreator.GetDesktops());
                SetListControlMembers(cbxCRT, ProductsCreator.GetCRTs());
                SetListControlMembers(listBox, ProductsCreator.GetPeripherals());
                lsdeskpc.SelectedIndexChanged += ProductsSelectedChanged;
                cbxCRT.SelectedIndexChanged += ProductsSelectedChanged;
                listBox.SelectedIndexChanged += ProductsSelectedChanged;
            }
    
            
            private void ProductsSelectedChanged(object sender, EventArgs e)
            {
                int sum = (int)lsdeskpc.SelectedValue + (int)cbxCRT.SelectedValue;
               foreach (int item in listBox.SelectedIndices)
                {
                    sum += ((List<Product>)listBox.DataSource)[item].Price;
                }
                lblsum.Text = string.Format("合計 : {0}", sum);
            }
    
            /// <summary>
            /// 因為 Combobox 和 ListBox 的父類別都是 ListControl
            /// 而且 DisplayMember 和 ValueMember 都是繼承自 ListControl
            /// </summary>
            /// <param name="control"></param>
            private void SetListControlMembers(ListControl control, List<Product> data)
            {            
                control.DataSource = data;
                control.DisplayMember = "Name";
                control.ValueMember = "Price";
            }
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2018年3月14日 下午 05:40
    版主