Почему не работает проверка добавления в DataGridView при существовании такого же поля
Нужно создать проверку добавления или изменения учебного предмета. Если введенное название и класс уже есть то должна срабатывать ошибка, чего не происходит :c
Вот сама проверка:
public static bool HaveSameDiscipline(DataGridView dgv, string name,string classDiscipline ,int selectRow)
{
bool error = false;
for (int i = 0; i < dgv.Rows.Count; i++)
{
if ((dgv.Rows[i].Cells[1].Value.ToString().Equals(name))
&& (dgv.Rows[i].Cells[2].Value.ToString().Equals(classDiscipline))
&& (selectRow != i))
{
error = true;
}
}
return error;
}
Вызывается проверка здесь, после чего изменяется (в другом таком же методе добавляется) значение в базу данных:
public static void UpadateDiscipline(string name, string classDiscipline)
{
//изменение после получения значений
CanAdd = true;
if (string.IsNullOrEmpty(name))
{
Errors.ShowMessage("Вы не заполнили название дисциплины.");
CanAdd = false;
}
else if (string.IsNullOrEmpty(classDiscipline))
{
Errors.ShowMessage("Вы не заполнили класс дисциплины.");
CanAdd = false;
}
else if (!int.TryParse(classDiscipline, out int num))
{
Errors.ShowMessage("Класс предмета состоит только из чисел");
CanAdd = false;
}
//вооот тут
else if (Errors.HaveSameDiscipline(GridsInfo.grid, name, classDiscipline, selectRow))
{
Errors.ShowPred("Такой предмет уже добавлен");
CanAdd = false;
}
else if (!Errors.IsFirstSymbolUp(name))
{
Errors.ShowPred("Мы сделаем введенное название с заглавной буквы.");
name = Errors.FirstUpper(name);
}
if (CanAdd)
{
SQLiteConnection con = new SQLiteConnection(@"data source=F:\E-diary\E-diary\E-diary\E-diaryDB.db");
con.Open();
string query = "UPDATE Disciplins SET name = '" + name + "', class = '" + int.Parse(classDiscipline) + "' WHERE id=" + GridsInfo.SelectDisciplineID;
SQLiteCommand cmd = new SQLiteCommand(query, con);
DataTable dt = new DataTable();
SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
adapter.Update(dt);
adapter.Fill(dt);
con.Close();
}
}
Ответы (1 шт):
К сожалению, из вопроса не очень понятно, происходит ли вызов самой функции HaveSameDiscipline. Если да, то очевидно, что проблема в проверке условия if.
Попробуйте разделить составное условие if(...&&...&&...) на три отдельных проверки, вложенных одна в другую. Так, в режиме отладки вы сможете посмотреть, где программа выполняет не то действие. Кроме того, оптимальнее было бы отказаться от переменной error. Код можно изменить примерно так:
public static bool HaveSameDiscipline(DataGridView dgv, string name,string classDiscipline ,int selectRow)
{
for (int i = 0; i < dgv.Rows.Count; i++)
{
if (dgv.Rows[i].Cells[1].Value.ToString().Equals(name))
if(dgv.Rows[i].Cells[2].Value.ToString().Equals(classDiscipline))
if(selectRow != i)
{
return true;
}
}
return false;
}
В режиме отладки просмотрите, какое из условий работает не так, как нужно.
Если же сама функция проверки не вызывается, значит ошибка присутствует в том, как вы её вызываете. Проверьте, правильные ли данные вы передаёте в функцию проверки и доходит ли код до её выполнения.
Кроме того, я могу посоветовать вам вынести все проверки в отдельную функцию проверки. Например, так:
private bool CheckInputValues(string name, string class)
{
//...
if(/*Очередное условие проверки*/){
Errors.ShowMessage(/*Сообщение об ошибке*/);
return false;
}
//...
return true;
}
А затем использовать её в качестве условия:
if(CheckInputValues(name, classDiscipline))
{
// SQL-запрос
}