解决  列表<>到文本框-工作但糟糕的代码-欢迎提出建议

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我在Win Form中有一个小应用程序,它可以接收用户输入的数据,并将其放入逗号分隔的文本文件中。

我希望能够在下次启动数据时将其加载回应用程序中。

数据取自用户和程序生成的5个文本框。因此txt文件如下所示:

123,12345,ABC ABC,00:00:10,ABC ABC
124,12345,ABC ABC,00:00:15,ABC ABC

值会根据用户输入的内容而变化-但是,仅FIRST项需要是唯一的-其他项可以并且经常会重复。

所以我用过:

C#:
List<string> lines = File.ReadAllLines("../../../txtFile.txt").ToList();

创建一个列表,然后使用以下代码来决定如何进行:

C#:
int sizeoflist;
sizeoflist = lines.Count();

一旦有了计数,就可以按照以下逻辑编写许多IF语句:

C#:
if (sizeoflist == 1)
            {
                string[] entries = lines[0].Split(',');
                HoldS1.Text = entries[0].ToString();
                HoldC1.Text = entries[1].ToString();
                HoldP1.Text = entries[2].ToString();
                HoldT1.Text = entries[3].ToString();
                desctbox1.Text = entries[4].ToString();
            }
            else if (sizeoflist == 2)
            {
                string[] entries = lines[0].Split(',');
                string[] entries2 = lines[1].Split(',');

                HoldS1.Text = entries[0].ToString();
                HoldC1.Text = entries[1].ToString();
                HoldP1.Text = entries[2].ToString();
                HoldT1.Text = entries[3].ToString();
                desctbox1.Text = entries[4].ToString();

                HoldS2.Text = entries2[0].ToString();
                HoldC2.Text = entries2[1].ToString();
                HoldP2.Text = entries2[2].ToString();
                HoldT2.Text = entries2[3].ToString();
                desctbox2.Text = entries2[4].ToString();
            }

这可行,但是需要我对十二组文本框(最后一个TextBox是HoldS12)执行十二次-这意味着到我到达最后一个文本框时,我将拥有另一个if语句,该语句较长而不是整个程序代码的总和。

我对此很陌生,只是觉得也许有比重复一遍又一遍代码更好的方法。我的意思是这行得通,但是我无法想象这是一个好方法。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
Firstly, what's the point of calling ToList when ReadAllLines returns an array and you can just use that?

As for the question, you can just use a for loop and then get the controls to populate by name based on the loop counter:
C#:
var lines = File.ReadAllLines("..\..\..\txtFile.txt");

for (var i = 0; i < lines.Length; i++)
{
    var fields = lines[i].Split(',');
    var controlNumber = i + 1;
   
    Controls($"HoldS{controlNumber}").Text = fields[0];  
    Controls($"HoldC{controlNumber}").Text = fields[1];  
    Controls($"HoldP{controlNumber}").Text = fields[2];  
    Controls($"HoldT{controlNumber}").Text = fields[3];  
    Controls($"desctbox{controlNumber}").Text = fields[4];
}
Note that String.Split returns a String array so there's no point to calling ToString on its elements. Just be aware that, with this code, you won't clear the other controls if they don't get populated from the file. If you want that to happen then you'd need to do a bit more work.
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
多谢您抽出宝贵时间回覆-真的很感激。

整个ToList / split事情都是试图将它们放入对象,因为我认为这可能是一种更好的数据管理方式,拥有HoldS对象列表我认为可能更容易填充文本框-但这并没有真正实现而且我还没有删除骨干。

感谢您提供的代码,其他控件在加载时应该为空白,因此,如果它们保持空白,那绝对没问题。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我确实遇到了自己尝试时遇到的相同问题。我已经尝试过this.Controls和其他各种代码Controls.Find等。

C#:
 控制项 ($"HoldS{controlNumber}").Text = fields[0];

这将控件显示为错误。

"C#不可说话的成员不能像方法一样使用。"

它没有提供任何选择"using System. "而且我觉得也许我缺少在进行这项工作之前应该做的事情。

我以前尝试使用控件时遇到了这个问题,但是我也注意到,使用C#WPF时-您不能使用Timer-您可以在WinForm中使用它-所以我想也许是因为控件是一个类似的问题,您可以在C#WPF中使用,但不在WinForm中使用。

但是,现在您已经将其发布到WinForm区域中,我在想,也许我错过了需要插入的一个关键内容,然后才能起作用?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
Controls( 指数 ) 应该是控件[ 指数 ]
糟糕!那就是编写大量VB代码和C#并直接在论坛中而不是通过IDE键入代码所获得的。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
糟糕!那就是编写大量VB代码和C#并直接在论坛中而不是通过IDE键入代码所获得的。

我知道您的感受,我用excel在VBA中编写了该程序,但是电子表格与其他电子表格的交互存在问题,因此将其移至C#。

我没有说这个,我说的是....非常感谢您的这段代码,它确实用途广泛,我能够遍历我的程序并删除了几百行代码并替换了它与您的代码的变体。

我知道控件会很有用,但从未与任何人互动以确定其正常工作...现在,事实证明,它非常有用。所以再次感谢您抽出宝贵的时间来编写它。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,530
地点
弗吉尼亚州切萨皮克
编程经验
10+
花时间浏览文档,而不要依赖Intellisense和自动完成功能。您将学到很多关于各种课程及其提供的知识。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
花时间浏览文档,而不要依赖Intellisense和自动完成功能。您将学到很多关于各种课程及其提供的知识。
请注意,如果您已经知道类型或成员,那么确实没有任何理由不这样做。上下文相关帮助在Windows中已经存在数十年了,它意味着您可以单击代码中的类型或成员,然后按F1键直接转到该类型或成员的文档。即使没有,您仍然可以使用VS中的“帮助”菜单转到文档主页并从那里导航,但是我还建议每个人都在其浏览器中收藏/添加书签文档API参考主页。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
请注意,如果您已经知道类型或成员,那么确实没有任何理由不这样做。上下文相关帮助在Windows中已经存在数十年了,它意味着您可以单击代码中的类型或成员,然后按F1键直接转到该类型或成员的文档。即使没有,您仍然可以使用VS中的“帮助”菜单转到文档主页并从那里导航,但是我还建议每个人都在其浏览器中收藏/添加书签文档API参考主页。

MSDN的文档页面是我一生中读过的最密集的东西。我是一名研究土地法的律师...

我知道为什么,这是一个复杂的领域,他们承担不起错误的费用,但是作为学习C#的指南?我认为它是为学习它的人而写的,他们要么需要学习更多,要么想提醒自己。

如果时间不是很奇怪,我本可以报名参加夜校课程,但鉴于我们所处的位置,我已经看过在线课程,但还没有真正找到我认为自己会满意的课程。

因此,边做边做,尝试,操作,提出问题来学习,并感谢所教给我的答案。

这不是我的工作,是一种业余爱好,是我正在学习的东西,因为它很有趣,很有趣并且在一定程度上很有用。
 
最佳 底部