文件,字符串和保存

时间:2012-04-27 10:59:23

标签: c#

我一直在努力解决这个问题。当我想我拥有它时,我被告知没有。这是它的图片。 enter image description here

我正在处理保存按钮。现在,在用户添加名字,姓氏和职位后,他们可以保存它。如果用户加载文件并且它出现在列表框中,那么该人应该能够点击名称,然后点击编辑按钮,他们应该能够编辑它。我有代码,但我确实通知它看起来像wackey,字符串应该有名字,姓氏和职称。

当我学习C#时,我真的很困惑。我知道如何使用savefiledialog但我不允许在这个上使用它。以下是我想要做的事情:

  

当用户单击“保存”按钮时,将所选记录写入   没有在txtFilePath中指定的文件(绝对路径不相对)   截断当前内部的值。

我仍然在处理我的代码,因为我被告知在一组三个字符串中更好的文件写入记录。但这是我现在的代码。

    private void Save_Click(object sender, EventArgs e)
    {

            string path = txtFilePath.Text;


            if (File.Exists(path))
            {
                using (StreamWriter sw = File.CreateText(path))
                {

                    foreach (Employee employee in employeeList.Items)
                        sw.WriteLine(employee);
                }
            }
            else
                try
            {

                StreamWriter sw = File.AppendText(path);

                foreach (var item in employeeList.Items)
                    sw.WriteLine(item.ToString());

            }

    catch
{
    MessageBox.Show("Please enter something in");
}

现在我无法使用保存或打开文件对话框。用户应该能够打开C,E,F驱动器上的任何文件或它的位置。我还被告知它应该是obj.Also程序应该处理和出现异常。

我知道这可能是一个noobie问题但我的思绪仍然停滞不前,因为我仍在学习如何使用C#进行编码。现在我一直在寻找和阅读。但我找不到任何东西来帮助我理解如何将所有这些变成一个代码。如果有人可以帮助甚至指向更好的网站,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

您必须确定一种适合您需求的储蓄方式。存储此信息的简单方法可以是CSV:

"Firstname1","Lastname 1", "Jobtitle1"
" Firstname2", "Lastname2","Jobtitle2 "

如您所见,数据不会被截断,因为分隔符"用于确定字符串边界。

this question所示,使用CsvHelper可能是一种选择。但鉴于这是家庭作业及其中的约束,您可能必须自己创建此方法。您可以将其放在Employee(或使其成为override ToString())中,以便按照以下方式执行操作:

public String GetAsCSV(String firstName, String lastName, String jobTitle)
{
    return String.Format("\"{0}\",\"{1}\",\"{2}\"", firstName, lastName, jobTitle);
}

我会留下如何将数据作为练习重新读给你的方式。 ; - )

答案 1 :(得分:1)

在使用WriteLine编写员工对象时,正在调用基础ToString()。首先要做的是自定义ToString()方法以满足您的需求:

public class Employee
{
    public string FirstName;
    public string LastName;
    public string JobTitle;

    // all other declarations here
    ...........

    // Override ToString()
    public override string ToString()
    { 
         return string.Format("'{0}', '{1}', '{2}'", this.FirstName, this.LastName, this.JobTitle);
    }
}

这样,您的编写代码仍然保持干净和可读。

顺便说一下,没有相反的ToSTring,但是为了遵循.Net标准,我建议你实现一个Employee的方法,如:

public static Employee Parse(string)
{
        // your code here, return a new Employee object
}

答案 2 :(得分:1)

有许多方法可以将数据存储在文件中。此代码演示了4种非常易于使用的方法。但关键是你应该把你的数据拆分成单独的部分而不是将它们存储为一个长字符串。

public class MyPublicData
{
  public int id;
  public string value;
}

[Serializable()]
class MyEncapsulatedData
{
  private DateTime created;
  private int length;
  public MyEncapsulatedData(int length)
  {
     created = DateTime.Now;
     this.length = length;
  }
  public DateTime ExpirationDate
  {
     get { return created.AddDays(length); }
  }
}

class Program
{
  static void Main(string[] args)
  {
     string testpath = System.IO.Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TestFile");

     // Method 1: Automatic XML serialization
     // Requires that the type being serialized and all its serializable members are public
     System.Xml.Serialization.XmlSerializer xs = 
        new System.Xml.Serialization.XmlSerializer(typeof(MyPublicData));
     MyPublicData o1 = new MyPublicData() {id = 3141, value = "a test object"};
     MyEncapsulatedData o2 = new MyEncapsulatedData(7);
     using (System.IO.StreamWriter w = new System.IO.StreamWriter(testpath + ".xml"))
     {
        xs.Serialize(w, o1);
     }

     // Method 2: Manual XML serialization
     System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(testpath + "1.xml");
     xw.WriteStartElement("MyPublicData");
     xw.WriteStartAttribute("id");
     xw.WriteValue(o1.id);
     xw.WriteEndAttribute();
     xw.WriteAttributeString("value", o1.value);
     xw.WriteEndElement();
     xw.Close();

     // Method 3: Automatic binary serialization
     // Requires that the type being serialized be marked with the "Serializable" attribute
     using (System.IO.FileStream f = new System.IO.FileStream(testpath + ".bin", System.IO.FileMode.Create))
     {
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = 
           new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        bf.Serialize(f, o2);
     }

     // Demonstrate how automatic binary deserialization works
     // and prove that it handles objects with private members
     using (System.IO.FileStream f = new System.IO.FileStream(testpath + ".bin", System.IO.FileMode.Open))
     {
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf =
           new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        MyEncapsulatedData o3 = (MyEncapsulatedData)bf.Deserialize(f);
        Console.WriteLine(o3.ExpirationDate.ToString());
     }

     // Method 4: Manual binary serialization
     using (System.IO.FileStream f = new System.IO.FileStream(testpath + "1.bin", System.IO.FileMode.Create))
     {
        using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(f))
        {
           w.Write(o1.id);
           w.Write(o1.value);
        }
     }

     // Demonstrate how manual binary deserialization works
     using (System.IO.FileStream f = new System.IO.FileStream(testpath + "1.bin", System.IO.FileMode.Open))
     {
        using (System.IO.BinaryReader r = new System.IO.BinaryReader(f))
        {
           MyPublicData o4 = new MyPublicData() { id = r.ReadInt32(), value = r.ReadString() };
           Console.WriteLine("{0}: {1}", o4.id, o4.value);
        }
     }
  }
}