好消息是我对这个项目的最后一部分,坏消息是我无法弄明白。我的程序包含两种形式。第一种形式仅在此时相关,因为它是我最初将文本文件加载到字典中的位置。
class SharedMethods
{
public static void LoadDictionary(Dictionary<string, string> vendorPhones)
{
string currentLine;
string[] fields = new string[2];
StreamReader vendorReader = new StreamReader("Vendor.txt");
while (vendorReader.EndOfStream == false)
{
currentLine = vendorReader.ReadLine();
fields = currentLine.Split(',');
vendorPhones.Add(fields[1], fields[6]);
string[] name = { fields[1] };
string[] phone = { fields[6] };
}
vendorReader.Close();
}
}
现在第二种形式是重要的。此表单从第一个表单打开,允许用户从组合框中选择一个名称,属于该名称的电话号码显示在文本框中。然后,用户可以在文本框中键入以覆盖该名称,然后单击“保存”将其保存到文本文件中。我的问题是我无法弄清楚如何让写入功能在文本中找到所选名称,然后在该行中的当前手机元素上书写。以下是此表单的代码:
public partial class UpdateVendor : Form
{
public UpdateVendor()
{
InitializeComponent();
}
public Dictionary<string, string> vendorPhones = new Dictionary<string, string>();
private void UpdateVendor_Load(object sender, EventArgs e)
{
SharedMethods.LoadDictionary(vendorPhones);
foreach (string name in vendorPhones.Keys)
{
cboVendors.Items.Add(name);
}
}
private void cboVendors_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedName = cboVendors.SelectedItem.ToString();
string phone = vendorPhones[selectedName];
txtPhone.Text = phone.ToString();
}
private void btnSave_Click(object sender, EventArgs e)
{
//SharedMethods.LoadDictionary(vendorPhones);
//string selectedName = cboVendors.SelectedItem.ToString();
//string newPhone;
//newPhone = txtPhone.Text;
//using (var sw = new StreamWriter("Vendors.txt"))
//{
//}
// I've tried a lot of things but can't get any to work.
}
对不起,如果代码让你厌恶地畏缩。我只是在学习代码而且我欣喜若狂,它的工作时间只有一半。
要添加,以下是程序在运行时的外观: Second form running
答案 0 :(得分:0)
请尝试以下操作:
string selectedName = cboVendors.SelectedItem.ToString();
string phone = vendorPhones[selectedName];
if (vendorPhones.ContainsKey(selectedName))
{
vendorPhones[selectedName] = phone;
}
else
{
vendorPhones.Add(selectedName, phone);
}
答案 1 :(得分:0)
这里的问题是,因为您在首先阅读文件时没有捕获所有数据,所以将它写回来必须有点棘手,这样您就不会丢失任何数据。
我们可以做的是将整个文件重新读回一个数组,然后在数组中搜索包含我们的供应商和原始电话号码的每一行。当我们找到该行时,将电话号码部分更新为新号码。然后,再次将所有行写回文件
以下是一种方法:
private void btnSave_Click(object sender, EventArgs e)
{
// Grab the selected vendor name
string selectedName = cboVendors.SelectedItem.ToString();
// Grab the original phone number for this vendor
string originalPhone = vendorPhones[selectedName];
// Read all the file lines into an array:
var fileLines = File.ReadAllLines("Vendor.txt");
// Now we iterate over the file lines one by one, looking for a match
for (int i = 0; i < fileLines.Length; i++)
{
// Break the line into parts to see if this line is the one we need to update
string[] lineParts = fileLines[i].Split(',');
string name = lineParts[1];
string phone = lineParts[6];
// Compare this line's name and phone with our originals
if (name == selectedName && phone == originalPhone)
{
// It's a match, so we will update the phone number part of this line
lineParts[6] = txtPhone.Text;
// And then we join the parts back together and assign it to the line again
fileLines[i] = string.Join(",", lineParts);
// Now we can break out of the loop since we updated our vendor info
break;
}
}
// Finally, we can write all the lines back to the file
File.WriteAllLines("Vendor.txt", fileLines);
// May not be necessary, but if you're not reading back from the file right away
// then update the dictionary with the new phone number for this vendor
vendorPhones[selectedName] = txtPhone.Text;
}
但是,理想情况下,您在读取文件时会捕获所有数据,并且对于文件中的每一行,您将创建一个新的Vendor
对象,该对象具有表示每个逗号分隔值的属性。然后,这些Vendor
个对象可以存储在List<Vendor>
中。现在,您可以显示和操作一个强类型对象的集合,当您完成所有操作后,您可以以类似的方式将它们全部写回文件。
但那不是你的问题,而且听起来你可能还不是那么......