Файл: Курсовая работа Расчетнопояснительная записка Дисциплина Программирование и основы алгоритмизации Студент Буков А. А.docx

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 26.04.2024

Просмотров: 32

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


{

return photo;

}

set

{

photo = value;

}

}
// link

public string Link

{

get

{

return link;

}

set

{

link = value;

}

}

}

}


  1. Компиляция приложения необходима для того, чтобы информацию о созданном классе можно было использовать при настройке свойства 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. 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;

}

    1. Проверка правильности на уровне строки таблицы



Определение события 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;

}



    1. Использование XML-сериализации для сохранения и загрузки наборов данных





  1. Добавить на форму Form2 невизуальных компонентов типа OpenFileDialog и SaveFileDialog, а также компонента меню MenuStrip (эти компоненты получат имена openFileDialog1, saveFileDialog1, menuStrip1).

  2. Создать в компоненте menuStrip1 пункт меню первого уровня Файл (Name - file1). В выпадающем меню, связанном с пунктом Файл, создать четыре пункта меню с текстом Создать, Открыть…, Сохранить как…, Выход.

  3. Настройка свойств добавленных компонентов и пунктов меню:

Пункт меню Создать (группа Файл): Name = new1

Пункт меню Открыть (группа Файл): Name = open1



Пункт меню Сохранить как (группа Файл): Name = save1

Пункт меню Выход (группа Файл): Name = exit1

  1. Добавление в начало файла Form2.cs операторов:


using System.IO;

using System.Xml.Serialization;


  1. Добавление нового поля в описание класса Form2:


private XmlSerializer xmls = new XmlSerializer(typeof(List));


  1. Дополнение конструктора класса Form2:


public Form2()

{

InitializeComponent();

contactsBindingSource.DataSource = new List();

}


  1. Описание в классе 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 + "");

}

}


  1. Определение обработчика события 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


    1. Автоматизация действий при добавлении нового элемента данных





  1. Настройка свойства первого столбца таблицы dataGridView1:


dataGridView1.Columns. Id1.ReadOnly = True,

DefaultCellStyle.ForeColor = GrayText,

DefaultCellStyle.SelectionForeColor = GrayText


  1. Дополнение метода 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 больше максимального из уже имеющихся номеров в загруженном наборе данных.

    1. Сортировка данных




  1. Создание в компоненте menuStrip1 нового пункта меню первого уровня с текстом Данные (Name - data1)

  2. Создание пунктов с текстом Сортировка по (Name - sortby1).

  3. Создание пунктов меню с текстом Порядковому номеру (Name – id2), Году (Name – year2), Цене (Name – price2) (рисунок 6).




Рисунок 6 – Создание меню с сортировкой


  1. Добавление новых операторов в конструктор класса Form2:



id2.Tag = 0;

year2.Tag = 1;

price2.Tag = 2;


  1. Добавление трёх вспомогательных методов в описание класса 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);


}


  1. Определение обработчика события Click для пунктов меню id2, year2, price2:


private void year2_Click(object sender, EventArgs e)

{

if (dataGridView1.RowCount == 1)

return;

dataGridView1.CurrentCell = dataGridView1[0, 0];

Comparison comp = CompareByYear;

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).Sort(comp);

carBindingSource.ResetBindings(false);

}

    1. Поиск по шаблону




  1. Подключение к проекту библиотеки Microsoft.VisualBasic (рисунок 7).




Рисунок 7 – Подключение к проекту библиотеки Microsoft.VisualBasic


  1. Добавление оператора в начало файла Form2.cs:


using Microsoft.VisualBasic;


  1. Добавление нового поля в описание класса Form2:


private string makeToFind = "";


  1. Дополнение выпадающего меню, связанного с пунктом Данные: добавление в него пункта с текстом Поиск (Name - find1).

  2. Изменение первого оператора метода dataGridView1_RowEnter:


private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)

{

find1.Enabled = bindingNavigatorDeleteItem.Enabled = !dataGridView1.Rows[e.RowIndex].IsNewRow;

}

  1. Определение обработчика события 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).FindIndex(dataGridView1.CurrentRow.Index, delegate (Car a)

{

return a.Country.StartsWith(makeToFind,

StringComparison.OrdinalIgnoreCase);

});
if (ind != -1)

dataGridView1.CurrentCell = dataGridView1[3, ind];

else

MessageBox.Show("Производитель авто не найден", "Поиск по производителю авто");

}