winforms 如何显示复选框/ windows窗体/ c#中的随机名称

dgiusagp  于 2022-12-27  发布在  Windows
关注(0)|答案(5)|浏览(113)

在开始我会说我是一个初学者在编程,但我想使一个程序的工作,将随机化的名字雇员。2只有名字是在复选框中选中。3它目前随机化我要么从所有的名字或从最近选定的。4名字迄今标记为:N1、N2、N3、N4、N5:我的代码如下:

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 MNW_v._1
{
    public partial class Form1 : Form
    {
      
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void N1_CheckedChanged(object sender, EventArgs e)
        {
            
        }

        private void N2_CheckedChanged(object sender, EventArgs e)
        {
            
        }

        private void N3_CheckedChanged(object sender, EventArgs e)
        {
            
        }

        private void N4_CheckedChanged(object sender, EventArgs e)
        {
            
        }

        private void N5_CheckedChanged(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] tablica = new string[] { N1.Text, N2.Text, N3.Text, N4.Text, N5.Text };
            
            Random rn = new Random();
            int obj = rn.Next(0, tablica.Length);
            Console.Write(obj);
            if (N1.Checked)
            {
                MessageBox.Show(N1.Text);
            }
            else if (N2.Checked)
            {
                MessageBox.Show(N2.Text);
            }
            else if (N3.Checked)
            {
                MessageBox.Show(N3.Text);
            }
            else if (N4.Checked)
            {
                MessageBox.Show(N4.Text);
            }
            else if (N5.Checked)
            {
                MessageBox.Show(N5.Text);
            }
            
        }
    }
}

我已经尝试过创建一个额外的类,但似乎选中复选框并不影响程序的操作。

ee7vknir

ee7vknir1#

下面是我能想到的解决这个问题的最简单的方法:

private Random rn = new Random();
private void button1_Click(object sender, EventArgs e)
{
    CheckBox[] tablica =
        new[] { N1, N2, N3, N4, N5 }
            .Where(n => n.Checked)
            .ToArray();

    if (tablica.Any())
    {
        CheckBox cb = tablica[rn.Next(0, tablica.Length)];
        MessageBox.Show(cb.Text);
    }
}

它只需要创建一个复选框数组,这些复选框是从最初的5个复选框集合中选中的,然后它确保数组中至少有一个复选框,并随机显示其中一个复选框的消息。
下面是一个效率稍低的方法(尽管有5个复选框,差异可以忽略不计),我认为稍微整洁一些:

private void button1_Click(object sender, EventArgs e)
{
    CheckBox cb =
        new[] { N1, N2, N3, N4, N5 }
            .Where(n => n.Checked)
            .OrderBy(x => rn.Next())
            .FirstOrDefault();

    if (cb != null)
    {
        MessageBox.Show(cb.Text);
    }
}
ao218c7q

ao218c7q2#

我宁愿使用CheckBox的数组,而不是它们的Text

using System.Linq;

...

private void button1_Click(object sender, EventArgs e) {
  // So we have all CheckBoxes of interest in the collection (array)
  // we can query
  var boxes = new CheckBox[] {
    N1, N2, N3, N4, N5
  };

  // How many checked CheckBoxes do we have
  int count = boxes.Count(box => box.Checked);

  // If we have at least one checked CheckBox, we can get random one
  string randomName = count > 0
    ? boxes.Where(box => box.Checked).ElementAt(Random.Shared.Next(count)).Text
    : ""; // If none of boxes has been checked 

  MessageBox.Show(randomName);      
}

如果您的.Net版本 * 不支持 * Random.Shared,您可以使用一个字段:

using System.Linq;

...

private static readonly Random random = new Random();

private void button1_Click(object sender, EventArgs e) {
  var boxes = new CheckBox[] {
    N1, N2, N3, N4, N5
  };

  int count = boxes.Count(box => box.Checked);

  string randomName = count > 0
    ? boxes.Where(box => box.Checked).ElementAt(random.Next(count)).Text
    : ""; 

  MessageBox.Show(randomName);      
}
ao218c7q

ao218c7q3#

据我所知,你想从被检查的名字中随机挑选一个。
如果CheckedChanged事件是通过在选中的复选框列表中添加或删除复选框来处理的,那么当您单击Pick按钮时,_random(它是一个 member 字段,不是每次都示例化)将被调用以选取一个保证小于列表中Count的数字。

例如,如图所示,此代码将生成**N4、N3、N2、N4、N2...**等。
出于测试目的,在示例化时将Random的值设定为2,可确保每次生成 * 相同 * 的伪随机序列。(否则,默认种子值Random从系统时钟获得,并在每次运行此代码时生成一个新序列。)

public partial class MainForm : Form
{
    public MainForm() =>  InitializeComponent();
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        buttonPick.Click += button1_Click;
        foreach (CheckBox checkbox in Controls.Cast<Control>().Where(_ => _ is CheckBox))
        {
            checkbox.CheckedChanged += onAnyCheckedChanged;
        }
    }
    List<CheckBox> _checkedCheckboxes = new List<CheckBox>();
    private void onAnyCheckedChanged(object? sender, EventArgs e)
    {
        if(sender is CheckBox checkbox)
        {
            if(checkbox.Checked) _checkedCheckboxes.Add(checkbox);
            else _checkedCheckboxes.Remove(checkbox);
            Text = $"{_checkedCheckboxes.Count} Selected";
        }
    }
    Random _random = new Random(2);
    private void button1_Click(object sender, EventArgs e)
    {
        BeginInvoke(() =>   // Don't block the click event
        {
            if(_checkedCheckboxes.Count == 0){
                MessageBox.Show("Check some names first");
            }
            else{
                int randomIndex = _random.Next(0, _checkedCheckboxes.Count);
                MessageBox.Show($"Picked: {_checkedCheckboxes[randomIndex].Text}");
            }
        });
    }
}
wr98u20j

wr98u20j4#

您的代码创建一个数组,生成一个随机数,然后忽略这两个数组,只选择第一个选定的名称。

var names = new List<string>();
 if (N1.Checked) names.Add(N1.Text);
 if (N2.Checked) names.Add(N2.Text);
 ...

现在生成随机索引

Random rn = new Random();
 int obj = rn.Next(0, names.Count);

现在用那个

Console.WriteLine(names[obj]);
lf3rwulv

lf3rwulv5#

我想这段代码应该可以帮助你:

public partial class Form1 : Form
{
    private readonly Random random;
    public Form1()
    {
        InitializeComponent();
        random = new Random(Guid.NewGuid().GetHashCode());
    }

    private void ButtonClick(object sender, EventArgs e)
    {
        List<string> namesList = new List<string>();
        foreach (Control control in Controls)
        {
            CheckBox checkBox = control as CheckBox;
            if (checkBox != null && checkBox.Checked)
            {
                namesList.Add(checkBox.Name);
            }
        }
        if (namesList.Count == 0)
        {
            MessageBox.Show("Check at least one option!");
        }
        else
        {
            int randomIndex = random.Next(0, namesList.Count);
            MessageBox.Show(namesList[randomIndex]);
        }
    }
}

快速解释:
1.关于new Random(Guid.NewGuid().GetHashCode());初始化。这段代码在你每次启动应用程序时提供不同的随机值。
1.我用Controls属性得到窗体的所有控件。这样你就可以在窗体上创建任意数量的复选框,而不用编辑这段代码。
希望这对你有帮助:)

相关问题