0

「会議」からの情報を保持するフォームを作成しています。ユーザーは、、、、、、およびに関する情報を入力titleします。私が現在取り組んでいるのは、次の「変更を保存」ボタンです。locationstartTimeendTimenotesdate

  1. すべての TextBox をクリアします。
  2. 入力を配列に格納します。
  3. のみtitleを ListBox に表示します。
  4. ListBox でタイトルをクリックすると、その配列要素に格納されている情報が、ユーザーが変更を加えたい場合に適切な TextBox に再入力されます。

#1、#2、#3 を完了しました。#4 について何か助けていただければ幸いです。以下にコーディングを貼り付けましたので、ご覧ください。

public partial class CalendarForm : Form
{
    int currentIndex;
    int arraySize = 0;
    Meeting[] meetingArray = new Meeting[100];

    public CalendarForm()
    {
        InitializeComponent();
    }

    private void saveChangesButton_Click(object sender, EventArgs e)
    {
        meetingArray[arraySize] = new Meeting();
        meetingArray[arraySize].title = textBoxTitle.Text;
        meetingArray[arraySize].location = textBoxLocation.Text;
        meetingArray[arraySize].startTime = textBoxStartTime.Text;
        meetingArray[arraySize].endTime = textBoxEndTime.Text;
        meetingArray[arraySize].notes = notesTextBox.Text;
        currentIndex = arraySize;
        arraySize++;
        meetingListBox.Enabled = true;
        textBoxTitle.Text = "";
        textBoxLocation.Text = "";
        textBoxStartTime.Text = "";
        textBoxEndTime.Text = "";
        notesTextBox.Text = "";

       *edit* added these two lines which now add the title to the listBox
       meetingListBox.Items.Add(meetingArray[currentIndex].title);
        Controls.Add(meetingListBox);

    }
}

public class Meeting
{
    public string title;
    public string location;
    public string startTime;
    public string endTime;
    public string notes;
};
4

2 に答える 2

0

データバインディングを調べて、これを適切に行う方法を学ぶことを強くお勧めしますが、迅速で汚い解決策が必要な場合は(ただし、最終的にはもっと多くの作業が必要になります)、次のようにします。

private void saveChangesButton_Click(object sender, EventArgs e)
{
    Meeting m = new Meeting();
    m.title = textBoxTitle.Text;
    m.location = textBoxLocation.Text;
    m.startTime = textBoxStartTime.Text;
    m.endTime = textBoxEndTime.Text;
    m.notes = notesTextBox.Text;
    meetingArray[arraySize] = m;
    currentIndex = arraySize;
    arraySize++;
    meetingListBox.Enabled = true;
    textBoxTitle.Text = "";
    textBoxLocation.Text = "";
    textBoxStartTime.Text = "";
    textBoxEndTime.Text = "";
    notesTextBox.Text = "";

    meetingListBox.Items.Add(m);
    //Controls.Add(meetingListBox);   // You don't need to keep adding the control every time!


}

今あなたのクラスでは、タイトルを返すようにMeetingオーバーライドします。ToString()は、デフォルトで追加しListBoxた方法を使用します。ToString()

SelectedIndexChanged#4を支援するために、イベントをバインドしてからプロパティを使用し、それをオブジェクトSelectedItemにキャストして戻し(が返されるため)、それを使用してさまざまなテキストボックスにデータを再入力します。MeetingObject

何かのようなもの:

private void meetingListBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
    Meeting m = meetingListBox.SelectedItem as Meeting;
    if (m != null) 
    {
        textBoxTitle.Text = m.title;
        //...etc for all your other text boxes.
    }
}
于 2013-02-20T19:30:17.157 に答える
0

これは、クラスをリファクタリングする方法です。

public partial class CalendarForm : Form
{
  private List<Meeting> Meetings { get; set; }

  public CalendarForm()
  {
    InitializeComponent();
    Meetings = new List<Meeting>();
  }

  private void saveChangesButton_Click(object sender, EventArgs e)
  {     
    try 
    {       
      Meeting meeting = CreateMeeting();
      Meetings.Add(meeting);
      meetingListBox.Add(meeting);
    }
    catch
    {
      //Add proper error handling here
    }            
  }

  private Meeting CreateMeeting()
  {
    return new Meeting()
    {
      Title = textBoxTitle.Text,
      Location = textBoxLocation.Text
      StartTime = DateTime.Parse(textBoxStartTime.Text),
      EndTime = DateTime.Parse(textBoxEndTime.Text),
      Notes = notesTextBox.Text,
     };
   }
}

//As Matt Burland answered already:
private void meetingListBox_SelectedIndexChanged(object sender, EventArgs e)
{
  Meeting meeting = meetingListBox.SelectedItem as Meeting;
  if (meeting != null) 
  {
    textBoxTitle.Text = meeting.Title;
    //...etc for all your other text boxes.
  }
}

public class Meeting
{
  public string Title { get; set; }
  public string Location  { get; set; }
  public DateTime StartTime  { get; set; }
  public DateTime EndTime  { get; set; }
  public string Notes  { get; set; }

  public override string ToString()
  {
    return Title; 
  }
}

多くの変更を加えましたが、特に Array から List<> への切り替えが顕著です。リストはより柔軟で、より優れた機能を提供します。本当に配列を使用する必要がある場合を除き、論理エラー インデックスの範囲外の型の問題に対する保護を強化するためだけに、配列を使用しないようにします。

また、個人的には、日付は DateTime 構造体形式で格納する必要があると考えていますが、これも好みの問題です。会議オブジェクトに割り当てる前に、入力 (特に日付) をサニタイズ/検証することが賢明であることに注意してください。

Meeting オブジェクトには、パブリック フィールドの代わりにプロパティが含まれるようになりました。何かを取得/設定する方法を変更したい場合は、プロパティが優先されます。

お役に立てれば。

于 2013-02-20T20:49:23.810 に答える