winforms 尝试弄清楚如何基于组合框选择动态地更改哪个数组用于标签?

fcipmucu  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(96)

所以很不幸我现在有点超级菜鸟,哈哈,所以如果可能的话请容忍我。
我正在尝试做的程序是一个钢琴音符随机发生器,为了有效地记忆音符/音阶。我想这将是一个有趣的小程序,以帮助我的钢琴之旅和编程之旅哈哈。Image of program
在这个程序里,我放了一个组合框,里面有每个钢琴音阶的选项,看起来像这样:picture of combo box.
然后我继续为每个音阶和该音阶的音符做了一个数组,如下所示:

//Arrays to store each scale
            string[] cMajor = { "C", "D", "E", "F", "G", "A", "B", "C", };
            string[] dMajor = { "D", "E", "F#", "G", "A", "B", "C#", "D", };
            string[] eMajor = { "E", "F#", "G#", "A", "B", "C#", "D#", "E", };
            string[] fMajor = { "F", "G", "A", "Bb", "C", "D", "E", "F", };
            string[] gMajor = { "G", "A", "B", "C", "D", "E", "F#", "G", };

然后我使用了一个随机数生成器,作为数组的索引,这样它会随机选择一个0到7之间的数,理想情况下,随机选择一个数组索引,然后我们可以将其传递到一个标签中,该标签将是屏幕上显示的钢琴音符。

//Number Generator to pass into the newNumber variable which will act as an index for the array
            Random generator = new Random();
            int newNumber  = generator.Next(0, 7); // Generating a number that equates to the number of notes in a particular scale

然后我输入代码,选中所选输入的组合框,然后根据所选的比例创建标签:

if (comboBox1.SelectedIndex == 0)
            {
                OUTPUTLABEL1.Font = new Font("Segoe UI", 100);
                OUTPUTLABEL1.Location = new Point(80, 5);
                OUTPUTLABEL1.Text = cMajor[newNumber];

            }

大部分时候,一切都是按计划进行的。我可以选择音阶,音符会弹出在屏幕上,问题是没有一个是动态的。音阶的选择是硬编码到程序中的,正如你所看到的。c大调的音阶也是硬编码的。
我可以从ComboBox中选择一个比例,文本将根据ComboBox中选择的比例动态更改。我能想到的唯一完成此操作的方法将创建大量冗余的if语句,我觉得可能有更好的方法可以完成此操作。
非常感谢你们,如果这是显而易见的,或者我可能犯了其他错误,我再次向你们道歉。这是我在这里的第一篇文章,我希望我已经为你们提供了足够的信息!再次感谢!
完整编码(忽略计时器):

public void RandomizeButton_Click(object sender, EventArgs e)
        {

            //Arrays to store each scale
            string[] cMajor = { "C", "D", "E", "F", "G", "A", "B", "C", };
            string[] dMajor = { "D", "E", "F#", "G", "A", "B", "C#", "D", };
            string[] eMajor = { "E", "F#", "G#", "A", "B", "C#", "D#", "E", };
            string[] fMajor = { "F", "G", "A", "Bb", "C", "D", "E", "F", };
            string[] gMajor = { "G", "A", "B", "C", "D", "E", "F#", "G", };

            //Number Generator to pass into the newNumber variable which will act as an index for the array
            Random generator = new Random();
            int newNumber  = generator.Next(0, 7); // Generating a number that equates to the number of notes in a particular scale

            if (comboBox1.SelectedIndex == 0)
            {
                OUTPUTLABEL1.Font = new Font("Segoe UI", 100);
                OUTPUTLABEL1.Location = new Point(80, 5);
                OUTPUTLABEL1.Text = cMajor[newNumber];

            }

            if (TimerCheckbox.Checked)
            {
                seconds = int.Parse(timeInterval.Text);
                timer1.Start();
            }         
        }

如果我对数组和组合框的思考方式不太理想,那么如果需要的话,我愿意接受一个全新的解决方案!非常感谢你们!

gpfsuwkq

gpfsuwkq1#

看起来你需要一个链接的数据结构。在一个变量和另一个变量之间建立Map的最常用的方法是使用字典

//you can use a dictionary
public Dictionary<string, string[]> scalesDict = new Dictionary<string, string[]>() {
        {"a", new string[]   { "C", "D", "E", "F", "G", "A", "B", "C", } },
        {"b", new string[]  { "D", "E", "F#", "G", "A", "B", "C#", "D", } },
        {"c", new string[]  { "E", "F#", "G#", "A", "B", "C#", "D#", "E", } },
        {"d", new string[]  { "F", "G", "A", "Bb", "C", "D", "E", "F", } },
        {"e", new string[]  { "G", "A", "B", "C", "D", "E", "F#", "G", } } };
private string[] GetScale(string comboBoxValue) {
    return scalesDict[comboBoxValue];
}

上面的代码将根据组合框的值(用组合框使用的任何值替换a、b、c、d和e)获取数组
字典是C#中非常强大的工具
你的问题有点模糊,所以我不知道我是否完全涵盖了你的问题,让我知道

相关问题