问题 我如何制作一个可以从comboBox选择中加载数据的程序?

哇哇

成员
已加入
2019年11月9日
留言内容
16
编程经验
Beginner
是的,所以我已经尝试了几天,但我真的无法提出任何建议,仅凭纯粹的基础知识。
C#:
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 WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

            using (var streamReader = new System.IO.StreamReader(filePath))
            {
                while (!streamReader.EndOfStream)
                {
                    string line = streamReader.ReadLine();
                    string[] index = line.Split('\t');

                    for(int i=0; i<index.Length; i++)
                    {
                        string[] prekPav = index[i].Split(':');
                        comboBox1.Items.Add(prekPav[i]);
                        comboBox1.Click -= comboBox1_Click;
                    }
                }
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

            using (var streamReader = new System.IO.StreamReader(filePath))
            {
                while (!streamReader.EndOfStream)
                {
                    string line = streamReader.ReadLine();
                    string[] index = line.Split('\t');

                    for (int i = 0; i < index.Length; i++)
                    {
                        string[] prek = index[i].Split(':');
                        string[] mat = prek[i+1].Split(',');
                        string[] kiek = prek[i+1].Split(':');
                        kiek[i] = kiek[i].Replace(mat[i] + ",", "");
                    }
                }
            }
        }
    }
}
我要做的就是在用户单击comboBox并取消订阅事件时生成comboBox.Items,因此我不仅会得到很多上述项目的副本。从那里开始,我需要这样做,以便当他们选择这些项目中的任何一项时,与他们相关的数据都将被加载到dataGridview中,而我被卡在这里。文件中的数据采用以下格式:项目名称:其尺寸,剩余量:尺寸,数量:尺寸,数量:...等。发生什么事,我从3个不同的项目数据中加载数据,而不是从我需要的不同维度或数量中加载数据。
如果可以的话,请使代码或任何技术性内容保持简单,以便我理解。谢谢。
 

附件

  • txt1.txt
    150 bytes · Views: 10

aw48

活跃成员
已加入
2013年2月9日
留言内容
35
地点
德国
编程经验
10+
你好,
那么它与所应用的代码有什么关系呢?
首先看起来像您正在填充组合框不正确
并且不命名字符串数组索引
 

aw48

活跃成员
已加入
2013年2月9日
留言内容
35
地点
德国
编程经验
10+
让我们看一下从文件读取数据的while循环。
如上面所说,ReadLine读取一行。如果您想用\ t分隔行,则您提供的数据格式不正确,因为在项目之间没有\ t。
因此,请概述您实际要做的事情。
我建议您在代码的每一行中添加一条注释行
如果您已解决问题,请通知论坛
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
我要做的就是在用户单击comboBox并取消订阅事件时生成comboBox.Items,因此我不仅会得到很多上述项目的副本。
为什么不像普通人那样在表单加载时仅填充组合框?为什么在用户单击组合框时只填充组合框?为什么您的退订呼叫在循环内?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
您应该只加载一次数据并将其全部保存在内存中-希望作为对象而不是字符串。只有在以后开始处理大量数据时,您才需要对需要显示的内容进行增量加载。无论如何,只要我想引导您沿着面向对象的方向发展,现在,我将尽力让您首先简化加载代码。

无论如何,您的组合框填充代码仅是偶然的原因,而不是有意的。
C#:
string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

using (var streamReader = new System.IO.StreamReader(filePath))
{
    while (!streamReader.EndOfStream)
    {
        string line = streamReader.ReadLine();
        string[] index = line.Split('\t');

        for(int i=0; i<index.Length; i++)
        {
            string[] prekPav = index[i].Split(':');
            comboBox1.Items.Add(prekPav[i]);
            comboBox1.Click -= comboBox1_Click;
        }
    }
}
首先,单击事件有多个注销。那甚至不应该是您的加载代码的一部分。您应该将其移至其他位置,或者如我所说的更好,只需在表单加载时填充组合框即可。无论如何,为了讨论起见,我将其删除以保留我们:

C#:
string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

using (var streamReader = new System.IO.StreamReader(filePath))
{
    while (!streamReader.EndOfStream)
    {
        string line = streamReader.ReadLine();
        string[] index = line.Split('\t');

        for(int i=0; i<index.Length; i++)
        {
            string[] prekPav = index[i].Split(':');
            comboBox1.Items.Add(prekPav[i]);
        }
    }
}

Your call to split doesn't really do anything because your file is line delimited, not tab delimited. So your index array will always have one element. So your loop will only ever loop one time since index.Length == 1. Furthermore, one of the happy accidents you have is that since i will always be 0, you are always happily getting the first part of line before the ':' (e.g. prekPav[0]):

Anyway since we only loop once and i == 0 that means we can take that for loop away and put in the constant 0 for i:
C#:
string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

using (var streamReader = new System.IO.StreamReader(filePath))
{
    while (!streamReader.EndOfStream)
    {
        string line = streamReader.ReadLine();
        string[] index = line.Split('\t');
        string[] prekPav = index[0].Split(':');
        comboBox1.Items.Add(prekPav[0]);
    }
}

And as previously mentioned, the splitting on the tab character isn't really doing anything, then we can just split line directly to get:
C#:
string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

using (var streamReader = new System.IO.StreamReader(filePath))
{
    while (!streamReader.EndOfStream)
    {
        string line = streamReader.ReadLine();
        string[] prekPav = line.Split(':');
        comboBox1.Items.Add(prekPav[0]);
    }
}

接下来,您似乎已经忽略了.NET Framework已经支持按行读取文件。您本可以使用较旧的 File.ReadAllLines() 或更新的 File.ReadLines()。当我知道处理完每一行后,我会选择后者。因此,我们最终得到:

C#:
string filePath = System.IO.Directory.GetCurrentDirectory() + @"\txt1.txt";

foreach (string line in File.ReadLines(filePath))
{
    string[] prekPav = line.Split(':');
    comboBox1.Items.Add(prekPav[0]);
}

然后,自己构建文件路径是一个非常糟糕的主意,因为在添加反斜杠(何时不添加反斜杠)时可能会出错。你应该用 Path.Combine() 而是让.NET Framework为您完成所有艰苦的工作:

C#:
using System.IO;
:
string filePath = Path.Combine(Directory.GetCurrentDirectory(), "txt1.txt");

foreach (string line in File.ReadLines(filePath))
{
    string[] prekPav = line.Split(':');
    comboBox1.Items.Add(prekPav[0]);
}

但后来变得更好。当您要访问当前目录中的文件时,甚至不需要完整路径。因此,您可以按名称引用文件:
C#:
foreach (string line in File.ReadLines("txt1.txt"))
{
    string[] prekPav = line.Split(':');
    comboBox1.Items.Add(prekPav[0]);
}
漂亮又简单。

Hopefully this will help you unravel the extra complexity you've put into your loading code when the selected item changes. Make note that in that code, it is mostly working by accident, rather than intention except for the fact that your luck ran out when it came to storing values into your kiek array.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+

哇哇

成员
已加入
2019年11月9日
留言内容
16
编程经验
Beginner
Like this : 问题-如何一次从文件读取数据,然后将其用于不同的按钮事件? -我认为这是他们最后一个话题的持续努力。至少我可以看到相似之处。我们的OP可以应用相同的技术,但没有应用。
这个问题仅供自我教育和将来参考,如果我将其应用到代码处理者中,将立即知道我只是在没有适当知识的情况下复制了互联网的某些内容。他还说要处理来自combobox和datagrid的新事件,这就是我所做的。无论如何,我发现了什么地方出了问题,现在它可以了(犯了同样的错误,总是使练习变得比原来困难得多)。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
我认为他不会。我在另一个主题上给您的内容非常基本,甚至没有使用任何类。我本可以用一类 ,这可能会引起一些怀疑。但是正如我给您的方式一样,即使对于业余爱好者,这也是基础且简单的研究。 :)
 

哇哇

成员
已加入
2019年11月9日
留言内容
16
编程经验
Beginner
我认为他不会。我在另一个主题上给您的内容非常基本,甚至没有使用任何类。我本可以用一类 ,这可能会引起一些怀疑。但是正如我给您的方式一样,即使对于业余爱好者,这也是基础且简单的研究。 :)
也许,我只是不喜欢向人们展示我可以做的事不仅仅是基础知识,因此他们不会对我抱有期望。 (认真的教授已经在谈论实习并为此建立自己的投资组合,甚至认为大学只有三个月过去了)
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
好吧,对于许多所谓的"coding bootcamps",您需要支付大约6个月的学费,大约需要2-3周的教育时间。这些训练营声称他们的毕业生准备去做生产工作。就我个人而言,我有疑问,因为听起来太好了,难以置信。
 
最佳 底部