Файл: Курсовая работа Расчетнопояснительная записка Дисциплина Программирование и основы алгоритмизации Студент Буков А. А.docx
Добавлен: 26.04.2024
Просмотров: 32
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
{
return photo;
}
set
{
photo = value;
}
}
// link
public string Link
{
get
{
return link;
}
set
{
link = value;
}
}
}
}
-
Компиляция приложения необходима для того, чтобы информацию о созданном классе можно было использовать при настройке свойства DataSource компонента carBindingSource.
В качестве значения свойства DataSource компонента carBindingSource следует указать имя только что определенного класса.
Вид столбцов компонента продемонстрирован на рисунке 3, правка столбцов – на рисунке 4.
Рисунок 3 – Вид столбцов таблицы
Рисунок 4 – Правка столбцов таблицы
Корректировка свойств столбцов:
Id: Name = Id1, HeaderText = №, ReadOnly = True;
Make: Name = Make1, HeaderText = Марка, ReadOnly = False;
Model: Name = Model1, HeaderText = Модель, ReadOnly = False;
Photo: Name = Photo1, HeaderText = Ссылка, Visible = False, ReadOnly = False;
Country: Name = Country1, HeaderText = Производитель, ReadOnly = False;
Year: Name = Year1, HeaderText = Год выпуска, ReadOnly = False;
Power: Name = Power1, HeaderText = Мощность двигателя, ReadOnly = False;
Price: Name = Price1, HeaderText = Цена, ReadOnly = False;
Link: Name = Link, HeaderText = Ссылка, ReadOnly = False;
- 1 2 3 4 5 6
Проверка правильности на уровне ячейки таблицы
Определение события CellValidating:
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].IsNewRow)
return;
string err = "", s = e.FormattedValue.ToString();
int i; double d;
switch (e.ColumnIndex)
{
// id
case 0:
// make
case 1:
if (s == "")
err = "Поле \"Марка\" не должно быть пустым";
break;
// model
case 2:
if (s == "")
err = "Поле \"Модель\" не должно быть пустым";
break;
// country
case 3:
if (s == "")
err = "Поле \"Производитель\" не должно быть пустым";
break;
// power
case 4:
if (!int.TryParse(s, out i))
err = "Строку нельзя преобразовать в число";
else if (i < 0)
err = "Отрицательные числа не допускаются";
break;
// year
case 5:
if (!int.TryParse(s, out i))
err = "Строку нельзя преобразовать в число";
else if (i < 0)
err = "Отрицательные числа не допускаются";
break;
// price
case 6:
if (!double.TryParse(s, out d))
err = "Строку нельзя преобразовать в число";
else if (d < 0)
err = "Отрицательные числа не допускаются";
break;
}
e.Cancel = err != "";
dataGridView1.Rows[e.RowIndex].ErrorText = err;
}
-
Проверка правильности на уровне строки таблицы
Определение события RowValidating:
private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].IsNewRow)
return;
string err = "";
if (dataGridView1[1, e.RowIndex].Value == null)
err = "Поле \"Марка\" должно быть непустым";
e.Cancel = err != "";
dataGridView1.Rows[e.RowIndex].ErrorText = err;
}
-
Использование XML-сериализации для сохранения и загрузки наборов данных
-
Добавить на форму Form2 невизуальных компонентов типа OpenFileDialog и SaveFileDialog, а также компонента меню MenuStrip (эти компоненты получат имена openFileDialog1, saveFileDialog1, menuStrip1). -
Создать в компоненте menuStrip1 пункт меню первого уровня Файл (Name - file1). В выпадающем меню, связанном с пунктом Файл, создать четыре пункта меню с текстом Создать, Открыть…, Сохранить как…, Выход. -
Настройка свойств добавленных компонентов и пунктов меню:
Пункт меню Создать (группа Файл): Name = new1
Пункт меню Открыть (группа Файл): Name = open1
Пункт меню Сохранить как (группа Файл): Name = save1
Пункт меню Выход (группа Файл): Name = exit1
-
Добавление в начало файла Form2.cs операторов:
using System.IO;
using System.Xml.Serialization;
-
Добавление нового поля в описание класса Form2:
private XmlSerializer xmls = new XmlSerializer(typeof(List
-
Дополнение конструктора класса Form2:
public Form2()
{
InitializeComponent();
contactsBindingSource.DataSource = new List
}
-
Описание в классе Form2 нового метода SaveData:
private void SaveData (string name)
{
int n = dataGridView1.RowCount;
for (int i = 0; i < n - 1; i++)
{
dataGridView1.Rows[i].Cells[7].Value = null;
}
if (name == "" || dataGridView1.RowCount == 1)
return;
if (dataGridView1.CurrentRow.IsNewRow)
dataGridView1.CurrentCell =
dataGridView1[0, dataGridView1.RowCount - 2];
StreamWriter sw = new StreamWriter(name, false, Encoding.Default);
xmls.Serialize(sw, carBindingSource.DataSource);
sw.Close();
for (int i = 0; i < n - 1; i++)
{
if (dataGridView1.Rows[i].Cells[8].Value != null)
dataGridView1.Rows[i].Cells[7].Value = new Bitmap(dataGridView1.Rows[i].Cells[8].Value + "");
}
}
-
Определение обработчика события DropDownOpening для пункта меню Файл, события Click для пунктов меню new1, open1, save1, exit1, а также события Form Closing для формы Form2, обработчика события CurrentCellDirtyStateChange для компонента dataGridView1:
private void new1_Click(object sender, EventArgs e)
{
carBindingSource.DataSource = new List
SaveData(saveFileDialog1.FileName);
saveFileDialog1.FileName = "";
Text = "CarShop";
dataGridView1.CurrentCell = null;
}
private void open1_Click(object sender, EventArgs e)
{
openFileDialog1.FileName = "";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
SaveData(saveFileDialog1.FileName);
string s = openFileDialog1.FileName;
StreamReader sr = new StreamReader(s, Encoding.Default);
carBindingSource.SuspendBinding();
carBindingSource.DataSource = xmls.Deserialize(sr);
carBindingSource.ResumeBinding();
sr.Close();
saveFileDialog1.FileName = s;
Text = "CarShop - " + Path.GetFileNameWithoutExtension(s);
int n = dataGridView1.RowCount;
for (int i = 0; i < n - 1; i++)
{
if (dataGridView1.Rows[i].Cells[8].Value != null)
{
dataGridView1.Rows[i].Cells[7].Value = new Bitmap(dataGridView1.Rows[i].Cells[8].Value + "");
dataGridView1.Rows[i].Height = new Bitmap(dataGridView1.Rows[i].Cells[8].Value + "").Height;
}
}
}
}
private void saveAs1_Click(object sender, EventArgs e)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string h = saveFileDialog1.FileName;
SaveData(h);
Text = "Car - " + Path.GetFileNameWithoutExtension(h);
}
}
private void exit1_Click(object sender, EventArgs e)
{
Close();
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
SaveData(saveFileDialog1.FileName);
}
private void file1_DropDownOpening(object sender, EventArgs e)
{
saveAs1.Enabled = dataGridView1.RowCount > 1;
}
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
menuStrip1.Enabled = !dataGridView1.IsCurrentCellDirty;
int row = dataGridView1.CurrentRow.Index;
if (!dataGridView1.IsCurrentCellDirty &&
(int)dataGridView1["Id1", row].Value == 0)
{
int maxId = 0;
for (int i = 0; i < row; i++)
{
int v = (int)dataGridView1["Id1", i].Value;
if (maxId < v)
maxId = v;
}
dataGridView1["Id1", row].Value = maxId + 1;
}
}
Дополнительные средства навигации и редактирования для таблицы с набором данных
Добавление на форму Form2 компонента типа BindingNavigator (Dock = Bottom, BindingSource = carBindingSource) приведено на рисунке 5.
Рисунок 5 – Добавление на форму Form2 компонента типа BindingNavigator
-
Автоматизация действий при добавлении нового элемента данных
-
Настройка свойства первого столбца таблицы dataGridView1:
dataGridView1.Columns. Id1.ReadOnly = True,
DefaultCellStyle.ForeColor = GrayText,
DefaultCellStyle.SelectionForeColor = GrayText
-
Дополнение метода dataGridView1_CurrentCellDirtyStateChanged:
public void updateId()
{
menuStrip1.Enabled = !dataGridView1.IsCurrentCellDirty;
int row = dataGridView1.CurrentRow.Index;
if (!dataGridView1.IsCurrentCellDirty &&
(int)dataGridView1["Id1", row].Value == 0)
{
int maxId = 0;
for (int i = 0; i < row; i++)
{
int v = (int)dataGridView1["Id1", i].Value;
if (maxId < v)
maxId = v;
}
dataGridView1["Id1", row].Value = maxId + 1;
}
}
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
form2.updateId();
};
Теперь при добавлении нового элемента данных в его свойство Id1, отображаемое в первом столбце таблицы с заголовком №, автоматически заносится номер, который на 1 больше максимального из уже имеющихся номеров в загруженном наборе данных.
-
Сортировка данных
-
Создание в компоненте menuStrip1 нового пункта меню первого уровня с текстом Данные (Name - data1) -
Создание пунктов с текстом Сортировка по (Name - sortby1). -
Создание пунктов меню с текстом Порядковому номеру (Name – id2), Году (Name – year2), Цене (Name – price2) (рисунок 6).
Рисунок 6 – Создание меню с сортировкой
-
Добавление новых операторов в конструктор класса Form2:
id2.Tag = 0;
year2.Tag = 1;
price2.Tag = 2;
-
Добавление трёх вспомогательных методов в описание класса Form2:
CompareById, CompareByYear, CompareByPrice:
private int CompareById(Car a, Car b)
{
return a.Id - b.Id;
}
private int CompareByYear(Car a, Car b)
{
return a.Year.CompareTo(b.Year);
}
private int CompareByPrice(Car a, Car b)
{
return a.Price.CompareTo(b.Price);
}
-
Определение обработчика события Click для пунктов меню id2, year2, price2:
private void year2_Click(object sender, EventArgs e)
{
if (dataGridView1.RowCount == 1)
return;
dataGridView1.CurrentCell = dataGridView1[0, 0];
Comparison
switch ((int)(sender as ToolStripMenuItem).Tag)
{
case 0:
comp = CompareById;
break;
case 1:
comp = CompareByYear;
break;
case 2:
comp = CompareByPrice;
break;
}
(carBindingSource.DataSource as List
carBindingSource.ResetBindings(false);
}
-
Поиск по шаблону
-
Подключение к проекту библиотеки Microsoft.VisualBasic (рисунок 7).
Рисунок 7 – Подключение к проекту библиотеки Microsoft.VisualBasic
-
Добавление оператора в начало файла Form2.cs:
using Microsoft.VisualBasic;
-
Добавление нового поля в описание класса Form2:
private string makeToFind = "";
-
Дополнение выпадающего меню, связанного с пунктом Данные: добавление в него пункта с текстом Поиск (Name - find1). -
Изменение первого оператора метода dataGridView1_RowEnter:
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
find1.Enabled = bindingNavigatorDeleteItem.Enabled = !dataGridView1.Rows[e.RowIndex].IsNewRow;
}
-
Определение обработчика события Click для пункта меню find1:
private void find1_Click(object sender, EventArgs e)
{
makeToFind = Interaction.InputBox("Введите начальную часть производителя авто для поиска:",
"Поиск по производителю авто", makeToFind, -1, -1).Trim();
if (makeToFind == "")
return;
int ind = (carBindingSource.DataSource as
List
{
return a.Country.StartsWith(makeToFind,
StringComparison.OrdinalIgnoreCase);
});
if (ind != -1)
dataGridView1.CurrentCell = dataGridView1[3, ind];
else
MessageBox.Show("Производитель авто не найден", "Поиск по производителю авто");
}