-1

私はこれを理解しようとして苦労しました。私がそれを持っていると思うとき、私はノーと言われます。これがその写真です。 ここに画像の説明を入力

私は保存ボタンに取り組んでいます。ユーザーが名、姓、役職を追加したら、それを保存できます。ユーザーがファイルを読み込んでリストボックスに表示された場合、そのユーザーは名前をクリックしてから編集ボタンを押すことができ、編集できるはずです。私はコードを持っていますが、奇妙に見え、文字列には名、姓、役職が必要であるという通知を受けました。

私はC#を学んでいるので、本当に混乱しています。savefiledialog の使用方法は知っていますが、このダイアログ ボックスでは使用できません。これが私がやっていることです:

ユーザーが [保存] ボタンをクリックすると、現在内部にある値を切り捨てずに、選択したレコードを txtFilePath (相対パスではなく絶対パス) で指定されたファイルに書き込みます。

ファイルが3つの文字列のグループにレコードを書き込む方が良いと言われたので、私はまだコードに取り組んでいます。しかし、これは私が今持っているコードです。

    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である必要があるとも言われました。また、プログラムは発生した例外を処理する必要があります。

これは初心者の質問かもしれませんが、C# でコーディングする方法をまだ学んでいるので、私の心は立ち往生しています。今、検索して読んでいます。しかし、これらすべてを 1 つのコードにする方法を理解するのに役立つ何かが見つかりません。誰かが助けてくれたり、より良い Web サイトを指摘してくれたりしたら、私は感謝します。

4

3 に答える 3

1

あなたはあなたのニーズに合った節約の方法を決定しなければなりません。この情報を保存する簡単な方法はCSVです。

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

ご覧のとおり、区切り文字"は文字列の境界を決定するために使用されるため、データは切り捨てられません。

この質問に示されているように、 CsvHelperを使用することはオプションかもしれません。しかし、これは宿題とその制約を考えると、このメソッドを自分で作成する必要があるかもしれません。あなたはこれらの線に沿って何かをするこれを入れるEmployee(またはそれを作る)ことができます:override ToString()

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

演習として、データを読み戻す方法はお任せします。;-)

于 2012-04-27T11:09:28.433 に答える
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 標準に従うために、次のような従業員のメソッドを実装することをお勧めします。

public static Employee Parse(string)
{
        // your code here, return a new Employee object
}
于 2012-04-27T11:39:03.600 に答える
1

ファイルにデータを保存するには、非常に多くの方法があります。このコードは、非常に使いやすい 4 つのメソッドを示しています。ただし、重要なのは、データを 1 つの長い文字列として保存するのではなく、おそらくデータを別々の部分に分割する必要があるということです。

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);
        }
     }
  }
}
于 2012-04-27T11:47:45.437 に答える