c# - 有没有办法通过在c#中单击按钮来传递值
问题描述
我有一个简单的程序,它使用文本文件作为主要数据输入,我必须创建一个 Windows 窗体应用程序,允许用户使用该数据进行操作。我创建了一些按钮,可以让我们删除、编辑、添加和显示 .txt 文件中的数据。我已经知道如何通过单击按钮从该表中写出数据,但我似乎无法弄清楚如何从用户输入中保存数据。
private void input_Click(object sender, EventArgs e)
{
string brand;
int power, year;
double price;
string message, title, defaultValue;
message = "Input the brand of a tractor ";
title = "Insert a new Tractor";
defaultValue = "John Deere";
brand= Interaction.InputBox(message, title, defaultValue, 100, 100);
defaultValue = "100";
message = "input Power";
power= Convert.ToInt32(Interaction.InputBox(message, title, defaultValue, 100, 100));
defaultValue = "100000";
message = "Input price";
cena = Convert.ToDouble(Interaction.InputBox(message, title, defaultValue, 100, 100));
defaultValue = "2020";
message = "input Year";
year= Convert.ToInt32(Interaction.InputBox(message, title, defaultValue, 100, 100));
Array.Resize(ref listTraktor, listTraktor.Length+1);
listTraktor[listTraktor.Length] = new Traktor(znamka, moc, cena, letnik);
string[] novaVsebina = new string[listTraktor.Length-1];
for (int i = 0; i < novaVsebina.Length-1; i++)
{
novaVsebina[i] = listTraktor[i].ToString();
}
File.WriteAllLines("Agromehanika.txt",novaVsebina , Encoding.UTF8);
}
Tractors 数组是在类中创建的。现在使用这段代码,我想向该表添加一个新的拖拉机并将值保存在该 txt 文件中。它基本上应该重写文件中的所有数据并添加用户输入的新数据,但我似乎无法理解如何将此数组传输到程序本身。谢谢您的帮助
解决方案
首先,我假设 Traktor 是您创建的一个类,它覆盖了 ToString 方法,以便它返回有关拖拉机而不是 {Namespace}.Traktor 的所需信息。
我在您的代码中看到的第一个问题是以下行:
listTraktor[listTraktor.Length] = new Traktor(znamka, moc, cena, letnik);
请注意,在 C# 和许多其他编程语言中,数组的第一个元素的索引是 0,因此数组的最后一个元素的索引是它的长度 - 1。
即:具有 10 个元素的数组从索引 0 开始,到索引 9 结束。
因此,这行代码将导致 IndexOutOfRangeException。要更改数组最后一个元素的值,您应该编写:
listTraktor[listTraktor.Length - 1] = new Traktor(znamka, moc, cena, letnik);
// haven't seen the parameters you pass to Traktor's constructor assigned, make sure you are also passing variables that exist in the context and are assigned
下一个问题是 string[] novaVsebina 的初始化。您正在创建一个长度比 listTraktor 数组小 1 的字符串数组。这实际上意味着您无法将所有元素的字符串存储在 listTraktor 中,因为您的字符串数组的长度更小。如果要将所有 tractors ToString() 结果存储在单独的数组元素中,则需要使该字符串数组与 tractors 数组的长度相同。
最后一个问题是你的 for 循环条件。正如我之前解释的,C# 中任何数组的最后一个元素的索引是数组的长度减 1。您的条件是:i < listTraktor.Length - 1,这意味着当 i 等于 listTraktor.Length - 1 时(其中,再次 - 是数组中最后一个元素的索引)条件将为 false 并且 for 循环将退出而不在数组的最后一个元素中存储值。要解决它,您需要使您的条件小于或等于数组的最后一个索引 (<=) 或删除 - 1 (两者都会导致相同的行为,因为当 i 等于 listTraktor.Length 时,它是比最后一个索引大 1,并且由于 listTraktor.Length 不小于 listTraktor.Length,因此条件为 false)。
解决上述所有问题后,您的代码应该可以按预期工作。
推荐阅读
- xamarin - 我如何在 Visual Studio MAC 中制作存档 iPA。最新版本出现错误
- java - 意外类型 必需:找到的变量:值
- karate - 是否可以在空手道中生成动态变量名称?
- python - 为什么 django 频道不接收标头?
- javascript - 使用 Angular Firebase 向不同的电子邮件发送电子邮件以验证注册
- unix - 使用 echo 的输出数作为 seq 的输入
- python - 在使用 flask-sqlalchemy db.engine.execute() 更新查询后调用选择查询返回未更新的结果集
- python - 创建一个日期时间添加月份的列
- c# - 在 onclick 事件之后,当我从函数调用 Blazor CascadingParameter 时,它不会更新布局
- c# - 在第一次出现字符后获取文本