【问题标题】:How can I set up multiple combo-boxes with the same data source?如何使用相同的数据源设置多个组合框?
【发布时间】:2016-07-30 04:39:46
【问题描述】:

我正在尝试为在 C# 中模拟棋盘游戏的程序创建设置界面。我有 1 个组合框,它允许用户选择玩家的数量,然后隐藏或显示选定的组合框数量。每个组合框最初应该有所有四个选项(红色、蓝色、绿色、黄色),但是当从一个组合框中选择一种颜色时,它应该从剩余的组合框中删除该选项(即如果玩家 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();
        }
    }
}

【问题讨论】:

  • 有什么意想不到的后果?此代码会产生错误吗?你并没有问太多问题。
  • 意外后果包括:在为 player1 选择“红色”后,如果 player2 选择了一种颜色,则 player1 的选择要么是空白的(意味着他/她不能改变他们对颜色的想法),要么颜色将重复,因此玩家 1 现在有 7 个选项,而不是 3 个选项。该代码不会产生错误。

标签: c# combobox


【解决方案1】:

这是我最终的做法(添加了一个“选择”选项以使其更符合逻辑,以便“取消选择”一种颜色):

List<string> colors = new List<string>() { "Select", "Red", "Blue", "Green", "Yellow" };
List<ComboBox> combos = new List<ComboBox>();

public Form1() {
  InitializeComponent();

  combos.AddRange(new ComboBox[] { comboBox1, comboBox2, comboBox3, comboBox4 });
  foreach (ComboBox cb in combos) {
    cb.Items.AddRange(colors.ToArray());
    cb.SelectedIndex = 0;
    cb.SelectedIndexChanged += cb_SelectedIndexChanged;
  }
}

void cb_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);
      }
    }
  }
}

基本上,逻辑是将所有选择的颜色放入一个列表中,然后检查该颜色是否显示在其他列表中,如果是,则将其删除。然后,您返回 ComboBox 项以查看是否缺少任何颜色,如果是,请重新添加。

【讨论】:

    【解决方案2】:

    万一其他人看到这篇文章,我想在包含 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();
                }
            }    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2021-01-10
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多