在数组中查找与选择匹配的元素并写入数组

时间:2017-05-15 00:06:56

标签: c# arrays combobox overwrite

好消息是我对这个项目的最后一部分,坏消息是我无法弄明白。我的程序包含两种形式。第一种形式仅在此时相关,因为它是我最初将文本文件加载到字典中的位置。

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

2 个答案:

答案 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>中。现在,您可以显示和操作一个强类型对象的集合,当您完成所有操作后,您可以以类似的方式将它们全部写回文件。

但那不是你的问题,而且听起来你可能还不是那么......