如何使用相同的数据源设置多个组合框?

时间:2016-04-08 19:21:54

标签: c# combobox

我正在尝试为模拟C#中的棋盘游戏的程序创建一个设置界面。我有1个ComboBox,允许用户选择播放器的数量,这反过来隐藏或显示选定数量的组合框。每个组合框应该最初具有所有四个选项(红色,蓝色,绿色,黄色),但是当从一个组合框中选择颜色时,它应该从剩余的组合框中移除该选项(即,如果玩家1选择红色,那么玩家2-4应该也不能选择红色)。现在我正在尝试使用多个列表来显示每个组合框中的信息,但我编写的用于从剩余的组合框中删除颜色的代码已经产生了许多意想不到的后果。我想知道是否有更好的方法来共享所有组合框之间的数据。任何帮助/想法将不胜感激!

我已附上下面的代码,让您更好地了解我正在使用的内容。谢谢你的时间!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StartPage.CS
{
    public partial class SetUp : Form
    {
        // Create a static array to hold the players
        public static Player[] players { get; private set; }

        // create lists to hold the colors for each player
        List<String> player1Colors = new List<String>();
        List<String> player2Colors = new List<String>();
        List<String> player3Colors = new List<String>();
        List<String> player4Colors = new List<String>();


        public SetUp()
        {
            InitializeComponent();
        }

        private void SetUp_Load(object sender, EventArgs e)
        {
            // initialize the selected index to 2 players
            cboSelectPlayers.SelectedIndex = 0;

            // add the colors to each list
            player1Colors.Add("Red");
            player1Colors.Add("Blue");
            player1Colors.Add("Green");
            player1Colors.Add("Yellow");

            player2Colors.Add("Red");
            player2Colors.Add("Blue");
            player2Colors.Add("Green");
            player2Colors.Add("Yellow");

            player3Colors.Add("Red");
            player3Colors.Add("Blue");
            player3Colors.Add("Green");
            player3Colors.Add("Yellow");

            player4Colors.Add("Red");
            player4Colors.Add("Blue");
            player4Colors.Add("Green");
            player4Colors.Add("Yellow");

            // add each list to it's respective comboBox
            for (int i = 0; i < player1Colors.Count; ++i)
            {
                cboPlayer1Color.Items.Add(player1Colors[i]);
            }
            for (int i = 0; i < player2Colors.Count; ++i)
            {
                cboPlayer2Color.Items.Add(player2Colors[i]);
            }
            for (int i = 0; i < player3Colors.Count; ++i)
            {
                cboPlayer3Color.Items.Add(player3Colors[i]);
            }
            for (int i = 0; i < player4Colors.Count; ++i)
            {
                cboPlayer4Color.Items.Add(player4Colors[i]);
            }
        }

        // method to create the players and add them to the array


        // handles displaying the number of players to select colors
        private void cboSelectPlayers_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboSelectPlayers.SelectedIndex == 0) // if players = 2
            {
                lblPlayer3Select.Hide();
                cboPlayer3Color.Hide();
                lblPlayer4Select.Hide();
                cboPlayer4Color.Hide();
            }
            else if (cboSelectPlayers.SelectedIndex == 1) // if players = 3
            {
                lblPlayer3Select.Show();
                cboPlayer3Color.Show();
                lblPlayer4Select.Hide();
                cboPlayer4Color.Hide();
            }
            else if (cboSelectPlayers.SelectedIndex == 2) // if players  4
            {
                lblPlayer3Select.Show();
                cboPlayer3Color.Show();
                lblPlayer4Select.Show();
                cboPlayer4Color.Show();
            }
        }

        // handles removing player1's selected color from other comboboxes
        private void cboPlayer1Color_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboPlayer1Color.SelectedItem == "Red")
            {
                // remove red from the other comboboxes
                player2Colors.Remove("Red");
                player3Colors.Remove("Red");
                player4Colors.Remove("Red");

                // make sure that the other colors that are supposed to be there are
                if (!player2Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
                {
                    player2Colors.Add("Blue");
                    player3Colors.Add("Blue");
                    player4Colors.Add("Blue");
                }
                if (!player2Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
                {
                    player2Colors.Add("Yellow");
                    player3Colors.Add("Yellow");
                    player4Colors.Add("Yellow");
                }
                if (!player2Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
                {
                    player2Colors.Add("Green");
                    player3Colors.Add("Green");
                    player4Colors.Add("Green");
                }
            }
            else if (cboPlayer1Color.SelectedItem == "Blue")
            {
                // remove blue from the other comboboxes
                player2Colors.Remove("Blue");
                player3Colors.Remove("Blue");
                player4Colors.Remove("Blue");

                // make sure that the other colors that are supposed to be there are
                if (!player2Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
                {
                    player2Colors.Add("Red");
                    player3Colors.Add("Red");
                    player4Colors.Add("Red");
                }
                if (!player2Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
                {
                    player2Colors.Add("Yellow");
                    player3Colors.Add("Yellow");
                    player4Colors.Add("Yellow");
                }
                if (!player2Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
                {
                    player2Colors.Add("Green");
                    player3Colors.Add("Green");
                    player4Colors.Add("Green");
                }
            }
            else if (cboPlayer1Color.SelectedItem == "Yellow")
            {
                // remove yellow from the other comboboxes
                player2Colors.Remove("Yellow");
                player3Colors.Remove("Yellow");
                player4Colors.Remove("Yellow");

                // make sure that the other colors that are supposed to be there are
                if (!player2Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
                {
                    player2Colors.Add("Red");
                    player3Colors.Add("Red");
                    player4Colors.Add("Red");
                }
                if (!player2Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
                {
                    player2Colors.Add("Blue");
                    player3Colors.Add("Blue");
                    player4Colors.Add("Blue");
                }
                if (!player2Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
                {
                    player2Colors.Add("Green");
                    player3Colors.Add("Green");
                    player4Colors.Add("Green");
                }
            }
            else if (cboPlayer1Color.SelectedItem == "Green")
            {
                // remove green from the other comboboxes
                player2Colors.Remove("Green");
                player3Colors.Remove("Green");
                player4Colors.Remove("Green");

                // make sure that the other colors that are supposed to be there are
                if (!player2Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
                {
                    player2Colors.Add("Red");
                    player3Colors.Add("Red");
                    player4Colors.Add("Red");
                }
                if (!player2Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
                {
                    player2Colors.Add("Blue");
                    player3Colors.Add("Blue");
                    player4Colors.Add("Blue");
                }
                if (!player2Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
                {
                    player2Colors.Add("Yellow");
                    player3Colors.Add("Yellow");
                    player4Colors.Add("Yellow");
                }
            }
            // clear and then update the other comboboxes
            cboPlayer2Color.Items.Clear();
            cboPlayer3Color.Items.Clear();
            cboPlayer4Color.Items.Clear();
            for (int i = 0; i < player2Colors.Count; ++i)
            {
                cboPlayer2Color.Items.Add(player2Colors[i]);
            }
            for (int i = 0; i < player3Colors.Count; ++i)
            {
                cboPlayer3Color.Items.Add(player3Colors[i]);
            }
            for (int i = 0; i < player4Colors.Count; ++i)
            {
                cboPlayer4Color.Items.Add(player4Colors[i]);
            }
        }

        // handles removing player2's selected color from other comboboxes
        private void cboPlayer2Color_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboPlayer2Color.SelectedItem == "Red")
            {
                // remove red from the other comboboxes
                player1Colors.Remove("Red");
                player3Colors.Remove("Red");
                player4Colors.Remove("Red");

                // make sure that the other colors that are supposed to be there are
                if (!player1Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
                {
                    player1Colors.Add("Blue");
                    player3Colors.Add("Blue");
                    player4Colors.Add("Blue");
                }
                if (!player1Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
                {
                    player1Colors.Add("Yellow");
                    player3Colors.Add("Yellow");
                    player4Colors.Add("Yellow");
                }
                if (!player1Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
                {
                    player1Colors.Add("Green");
                    player3Colors.Add("Green");
                    player4Colors.Add("Green");
                }
            }
            else if (cboPlayer2Color.SelectedItem == "Blue")
            {
                // remove blue from the other comboboxes
                player1Colors.Remove("Blue");
                player3Colors.Remove("Blue");
                player4Colors.Remove("Blue");

                // make sure that the other colors that are supposed to be there are
                if (!player1Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
                {
                    player1Colors.Add("Red");
                    player3Colors.Add("Red");
                    player4Colors.Add("Red");
                }
                if (!player1Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
                {
                    player1Colors.Add("Yellow");
                    player3Colors.Add("Yellow");
                    player4Colors.Add("Yellow");
                }
                if (!player1Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
                {
                    player1Colors.Add("Green");
                    player3Colors.Add("Green");
                    player4Colors.Add("Green");
                }
            }
            else if (cboPlayer2Color.SelectedItem == "Yellow")
            {
                // remove yellow from the other comboboxes
                player1Colors.Remove("Yellow");
                player3Colors.Remove("Yellow");
                player4Colors.Remove("Yellow");

                // make sure that the other colors that are supposed to be there are
                if (!player1Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
                {
                    player1Colors.Add("Red");
                    player3Colors.Add("Red");
                    player4Colors.Add("Red");
                }
                if (!player1Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
                {
                    player1Colors.Add("Blue");
                    player3Colors.Add("Blue");
                    player4Colors.Add("Blue");
                }
                if (!player1Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
                {
                    player1Colors.Add("Green");
                    player3Colors.Add("Green");
                    player4Colors.Add("Green");
                }
            }
            else if (cboPlayer2Color.SelectedItem == "Green")
            {
                // remove green from the other comboboxes
                player1Colors.Remove("Green");
                player3Colors.Remove("Green");
                player4Colors.Remove("Green");

                // make sure that the other colors that are supposed to be there are
                if (!player1Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
                {
                    player1Colors.Add("Red");
                    player3Colors.Add("Red");
                    player4Colors.Add("Red");
                }
                if (!player1Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
                {
                    player1Colors.Add("Blue");
                    player3Colors.Add("Blue");
                    player4Colors.Add("Blue");
                }
                if (!player1Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
                {
                    player1Colors.Add("Yellow");
                    player3Colors.Add("Yellow");
                    player4Colors.Add("Yellow");
                }
            }
            // clear and then update the other comboboxes
            cboPlayer1Color.Items.Clear();
            cboPlayer3Color.Items.Clear();
            cboPlayer4Color.Items.Clear();
            for (int i = 0; i < player2Colors.Count; ++i)
            {
                cboPlayer2Color.Items.Add(player2Colors[i]);
            }
            for (int i = 0; i < player3Colors.Count; ++i)
            {
                cboPlayer3Color.Items.Add(player3Colors[i]);
            }
            for (int i = 0; i < player4Colors.Count; ++i)
            {
                cboPlayer4Color.Items.Add(player4Colors[i]);
            }
        }

        // handles removing player3's selected color from other comboboxes
        private void cboPlayer3Color_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        // handles removing player4's selected color from other comboboxes
        private void cboPlayer4Color_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        /* method to update the comboBoxes
        private void updateComboBoxes()
        {
            for (int i = 0; i < player1Colors.Count; ++i)
            {
                cboPlayer1Color.Items.Add(player1Colors[i]);
            }
            for (int i = 0; i < player2Colors.Count; ++i)
            {
                cboPlayer2Color.Items.Add(player2Colors[i]);
            }
            for (int i = 0; i < player3Colors.Count; ++i)
            {
                cboPlayer3Color.Items.Add(player3Colors[i]);
            }
            for (int i = 0; i < player4Colors.Count; ++i)
            {
                cboPlayer4Color.Items.Add(player4Colors[i]);
            }
        }*/

        private void btnStart_Click(object sender, EventArgs e)
        {
            //Control control = new Control(players); 
            GameBoard gameboard = new GameBoard();
            gameboard.ShowDialog();
            this.Close();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果此帖上有其他人发生,我想在包含LarsTech代码后发布我的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StartPage.CS
{
    public partial class SetUp : Form
    {
        // Create a static array to hold the players
        public static Player[] players { get; private set; }

        // create lists to hold the colors for each player, as well as the comboBoxes
        List<String> colors = new List<String> { "Select Color","Red", "Blue", "Yellow", "Green" };
        List<ComboBox> combos = new List<ComboBox>();

        // constructor
        public SetUp()
        {
            InitializeComponent();

            // add colors to ComboBoxes and set the initial index
            combos.AddRange(new ComboBox[] { cboPlayer1Color, cboPlayer2Color, cboPlayer3Color, cboPlayer4Color });
            foreach (ComboBox combo in combos)
            {
                combo.Items.AddRange(colors.ToArray());
                combo.SelectedIndex = 0;
                combo.SelectedIndexChanged += combo_SelectedIndexChanged;
            }
        }

        // eventhandling for form load
        private void SetUp_Load(object sender, EventArgs e)
        {
            // initialize the selected index to 2 players
            cboSelectPlayers.SelectedIndex = 0;
        }

        // handles displaying the number of players to select colors
        private void cboSelectPlayers_SelectedIndexChanged(object sender, EventArgs e)
        {
            // reset each combobox to index 0
            foreach (ComboBox cbox in combos)
            {
                cbox.SelectedIndex = 0;
            }

            // Hide or Show comboboxes based on how many players are selected
            if (cboSelectPlayers.SelectedIndex == 0) // if players = 2
            {
                lblPlayer3Select.Hide();
                cboPlayer3Color.Hide();
                lblPlayer4Select.Hide();
                cboPlayer4Color.Hide();
            }
            else if (cboSelectPlayers.SelectedIndex == 1) // if players = 3
            {
                lblPlayer3Select.Show();
                cboPlayer3Color.Show();
                lblPlayer4Select.Hide();
                cboPlayer4Color.Hide();
            }
            else if (cboSelectPlayers.SelectedIndex == 2) // if players  4
            {
                lblPlayer3Select.Show();
                cboPlayer3Color.Show();
                lblPlayer4Select.Show();
                cboPlayer4Color.Show();
            }
        }

        // handles making sure that the same color can't be used by multiple players
        public void combo_SelectedIndexChanged(object sender, EventArgs e)
        {
            List<String> selectedColors = new List<String>();
            foreach (ComboBox cb1 in combos)
            {
                if (cb1.SelectedIndex > 0)
                {
                    selectedColors.Add(cb1.SelectedItem.ToString());
                }

                foreach (ComboBox cb2 in combos.Where(x => !x.Equals(cb1)))
                {
                    if (cb2.SelectedIndex > 0)
                    {
                        if (cb1.Items.Contains(cb2.SelectedItem.ToString()))
                        {
                            cb1.Items.Remove(cb2.SelectedItem.ToString());
                        }
                    }
                }
            }

            foreach (ComboBox cb in combos)
            {
                foreach (String c in colors)
                {
                    if (!selectedColors.Contains(c) && !cb.Items.Contains(c))
                    {
                        cb.Items.Add(c);
                    }
                }
            }
        }

        // handles form validation
        private Boolean formValidation()
        {
            if (cboSelectPlayers.SelectedItem.ToString() == "2") // if number of players = 2
            {
                // display error message if one of the players hasn't selected a color and return false
                if (cboPlayer1Color.SelectedIndex < 1 || cboPlayer2Color.SelectedIndex < 1)
                {
                    MessageBox.Show("Please select a color for each player!");
                    return false;
                }
                else
                {
                    players = new Player[2];
                    createPlayers(2);
                }
            }
            else if (cboSelectPlayers.SelectedItem.ToString() == "3") // if number of players = 3
            {
                // display error message if one of the players hasn't selected a color and return false
                if (cboPlayer1Color.SelectedIndex < 1 || cboPlayer2Color.SelectedIndex < 1 || cboPlayer3Color.SelectedIndex < 1)
                {
                    MessageBox.Show("Please select a color for each player!");
                    return false;
                }
                else
                {
                    players = new Player[3];
                    createPlayers(3);
                }
            }
            else if (cboSelectPlayers.SelectedItem.ToString() == "4") // number of players = 4
            {
                // display error message if one of the players hasn't selected a color and return false
                if (cboPlayer1Color.SelectedIndex < 1 || cboPlayer2Color.SelectedIndex < 1 || cboPlayer3Color.SelectedIndex < 1 || cboPlayer4Color.SelectedIndex < 1)
                {
                    MessageBox.Show("Please select a color for each player!");
                    return false;
                }
                else
                {
                    players = new Player[4];
                    createPlayers(4);
                }
            }

            // if no errors were found in validation, return true
            return true;
        }

        // create players and add them to the static array
        private void createPlayers(int numPlayers)
        {

            for (int i = 0; i < numPlayers; i++)
            {
                if (combos[i].SelectedItem.ToString() == "Red")
                {
                    players[i] = new Player(Color.Red);
                }
                else if (combos[i].SelectedItem.ToString() == "Blue")
                {
                    players[i] = new Player(Color.Blue);
                }
                else if (combos[i].SelectedItem.ToString() == "Yellow")
                {
                    players[i] = new Player(Color.Yellow);
                }
                else if (combos[i].SelectedItem.ToString() == "Green")
                {
                    players[i] = new Player(Color.Green);
                }
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (formValidation())
            {
                GameBoard gameboard = new GameBoard();
                gameboard.ShowDialog();
                this.Close();
            }
        }    
    }
}