1个按钮 1需要写入的文件 1 TextBox 1 NumericUpDown
因此,在我的应用程序中,我需要写入一个包含多行的文件。输入来自TextBox和NumericUpDown控件,它包含一般格式string.Format("{0}|{1}", TextBoxInput, NumericUpDownInput);
的字符串。
我需要帮助的是在添加新行之前检查重复的条目。基本上,如果用户决定输入他们已经拥有的东西(以更多的“时间”更新它),程序应检查新输入的输入是否与其中一行相匹配,如果匹配,则{{1} }部分应加在一起并替换原始值,同时保留{1}
部分。
我尝试解决这个问题的方法是创建一个名为{0}
的字符串列表和一个用于遍历newFile
的{{1}},以便查找新输入是否匹配已经输入的那个。
然后,有两种可能的情况:a)如果是,只需替换数字输入部分并将其添加到newFile,b)如果没有,只需将其添加到newFile。
最后,我使用了StreamWriter,以便用newFile覆盖originalFile。
不幸的是,由于我的方法无论出于何种原因生成空白文件,我都遇到了很多麻烦。如果我只是使用StreamWriter部分而不考虑重复的条目,它实际上工作得很好。
哦,还有一件事;如果程序也可以首先检查文件是否存在以避免异常,那将是很好的。我已经设法了,但我不认为这是最好的方法。请帮帮我。提前谢谢。
下面是按钮点击事件的代码,它基本上更新/添加到文件中(毕竟这是您需要的唯一代码):
for loop
P.S:很抱歉,如果我不够清楚,我不是母语为英语的人。
编辑:如果您想知道originalFile
代表什么,它基本上是来自TextBox的输入。
编辑2:我认为我的方法中的主要错误是我开始使用空的private void btnAdd_Click(object sender, EventArgs e)
{
// If input is either blank or invalid [-] (the input is verified through a database), show error message.
if (cardTitle == "" || cardTitle == "-")
MessageBox.Show("Correct any errors before trying to add a card to your Resources.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
// If the file does not exist, create it and close the stream object so as to further use the file.
if (!File.Exists("CardResources.ygodc"))
using (File.Create("CardResources.ygodc")) { };
string[] originalFile = File.ReadAllLines("CardResources.ygodc");
List<string> newFile = new List<string>();
for (int count = 0; count < originalFile.Length; count++)
{
string[] split = originalFile[count].Split('|');
string title = split[0];
string times = split[1];
if (title == cardTitle)
newFile[count].Replace(string.Format("{0}|{1}", title, times), string.Format("{0}|{1}", title, (nudTimes.Value + int.Parse(times)).ToString()));
else
newFile.Add(string.Format("{0}|{1}", cardTitle, nudTimes.Value.ToString()));
}
using (StreamWriter sw = new StreamWriter("CardResources.ygodc", true))
{
foreach (string line in newFile)
{
sw.WriteLine(line);
}
}
}
列表,而不是仅编辑cardTitle
列表。你怎么看待这个?
答案 0 :(得分:0)
始终将字符串添加到newFile(String.Format非常聪明地将类型转换为其字符串表示形式,因此您无需在int
上调用ToString)。并且不要追加,而是将完整的文件写回磁盘。
List<string> newFile = new List<string>();
bool isMatched = false;
if (File.Exists("CardResources.ygodc"))
{
string[] originalFile = File.ReadAllLines("CardResources.ygodc");
for (int count = 0; count < originalFile.Length; count++)
{
string[] split = originalFile[count].Split('|');
string title = split[0];
string times = split[1];
if (title == cardTitle)
{
newFile.Add(string.Format(
"{0}|{1}",
title, nudTimes.Value + int.Parse(times)));
isMatched =true;
}
else
newFile.Add(string.Format(
"{0}|{1}",
title, times));
}
}
if (!isMatched)
{
newFile.Add(string.Format(
"{0}|{1}",
cardTitle, nudTimes.Value));
}
using (StreamWriter sw = new StreamWriter("CardResources.ygodc"))
{
foreach (string line in newFile)
{
sw.WriteLine(line);
}
}
输入和输出样本:
Input | Output
card| Value |
----------------------
A | 1 | A|1
Input | Output
card| Value |
----------------------
B | 1 | A|1
| B|1
Input | Output
card| Value |
----------------------
C | 1 | A|1
| B|1
| C|1
Input | Output
card| Value |
----------------------
A | 2 | A|3
| B|1
| C|1