В С # для компонента Form определено свойство Controls, которое получает коллекцию всех элементов управления, содержащихся на форме. Для этого свойства определен метод Find (), выполняющий поиск элементов управления по их свойству Name и создающий массив из всех элементов управления, которые соответствуют условиям поиска. Воспользуемся этим методом в коде обработчика события Click кнопки AddButton.
private void AddButton_Click(object sender, EventArgs e)
{
string s = "listBox" + (OrgTabControl.SelectedIndex + 1);
ListBox CurrentListBox = (ListBox)Controls.Find(s, true)[0];
CurrentListBox.Items.Add(RecordTextBox.Text);
RecordTextBox.Text = "";
}
Запустите проект. Попробуйте добавить строки на разные страницы ежедневника.
При таком способе можно в любой момент разработки добавлять новые страницы ежедневника (например, “Важное” или “Купить”) и это не повлечет за собой необходимость изменения программного кода.
Воспользуемся этим же способом определения компонента ListBox, расположенного на текущей вкладке ежедневника, для того чтобы при выборе определенной строки в списке заметок пользователя в окне редактирования RecordTextBox отображалась выбранная запись. Создайте обработчик события Click для компонента listBox1.
|
|
private void listBox1_Click(object sender, EventArgs e)
{
string s = "listBox" + (OrgTabControl.SelectedIndex + 1);
ListBox CurrentListBox = (ListBox)Controls.Find(s, true)[0];
RecordTextBox.Text = (string)CurrentListBox.SelectedItem;
}
Далее для всех остальных компонентов ListBox укажите, чтобы при событии Click выполнялся обработчик этого события компонента listBox1. Для этого для каждого из оставшихся компонентов ListBox в окне Properties на вкладке событий справа от события Click выберите в списке listBox1_Click.
Запустите проект. Проверьте правильность выполнения.
Для того чтобы заметки, введенные пользователем, сохранялись и после закрытия приложения, и загружались в ежедневник при его последующем открытии, необходимо организовать их сохранение в файлы и считывание из файлов. Положим, что содержимое каждого дня ежедневника будет храниться в отдельном текстовом файле с расширением “ org ”, при этом название файла будет совпадать с выбранной пользователем датой, например, “18 июня 2011 г.org”.
Для хранения имени текущего файла опишите в классе формы строковую переменную FileName. В обработчике события Load главной формы приложения MainForm определите значение этой переменной:
private void MainForm_Load(object sender, EventArgs e)
{
FileName = dateTimePicker1.Text + "org";
}
Опишите метод SaveToFile сохранения содержимого ежедневника в файл с заданным именем следующим образом:
private void SaveToFile(string FileName)
{
try
{
//открываем файл для записи
using (StreamWriter sw = new StreamWriter(FileName))
{
// перебираем все компоненты ListBox
for (int i = 1; i <= 3; i++)
{
//задаем текущий компонент ListBox по имени
|
|
ListBox CurListBox =
(ListBox)Controls.Find("listBox" + i, true)[0];
//записываем в файл количество строк в списке sw.WriteLine(CurListBox.Items.Count.ToString());
//записываем в файл все записи из списка ListBox for (int j = 0; j < CurListBox.Items.Count; j++)
sw.WriteLine(CurListBox.Items[j]);
//очищаем список записей текущего ListBox CurListBox.Items.Clear();
}
}
}
catch
{
MessageBox.Show("Ошибка при сохранении!");
}
}
Поясним код. Для записи данных в текстовый файл, имя которого определено в переменной FileName, создаем экземпляр класса StreamWriter (не забудьте подключить System.IO в разделе using). Далее последовательно записываем в файл информацию, содержащуюся в каждом из трех компонентов ListBox, предварительно указав количество записей в текущем списке. В результате файл будет иметь следующую структуру:
N 1 – количество строк в компоненте listBox1
listBox1. Items [1]
… строки, содержащиеся в списке listBox1
listBox1. Items [ N 1]
N 2 – количество строк в компоненте listBox2
listBox2. Items [1]
… строки, содержащиеся в списке listBox2
listBox2. Items [ N 2]
N 3 – количество строк в компоненте listBox3
listBox3. Items [1]
… строки, содержащиеся в списке listBox3
listBox3. Items [ N 3]
Отметим, что в случае, когда при сохранении данных указывается короткое имя файла (без указания пути), файл сохраняется в каталог …/ Bin / Debug / текущего решения.
Аналогичным образом опишите метод LoadFromFile считывания данных из заданного файла. Обратите внимание на то, что в случае, когда заданный файл не найден (блок catch), необходимо полностью очищать содержимое страниц ежедневника.
Итак, при запуске приложения необходимо загрузить данные из соответствующего файла. Добавьте в конец обработчика события Load главной формы приложения MainForm вызов метода LoadFromFile:
private void MainForm_Load(object sender, EventArgs e)
{
FileName = dateTimePicker1.Text + "org";
LoadFromFile(FileName);
}
При выборе некоторой даты в компоненте DateTimePicker необходимо, во-первых, сохранить содержимое списков записей текущего дня, далее изменить дату и загрузить содержимое списков записей из соответствующего файла. В случае если такой файл не найден, необходимо просто очистить содержимое страниц ежедневника.
Создайте обработчик события ValueChanged компонента DateTimePicker и поместите туда следующий программный код:
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
SaveToFile(FileName);
FileName = dateTimePicker1.Text.Replace(" ", "") + "org";
LoadFromFile(FileName);
}
Запустите приложение, убедитесь в его работоспособности.