Почему не работает проверка добавления в 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 шт):

Автор решения: B0lver

К сожалению, из вопроса не очень понятно, происходит ли вызов самой функции 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-запрос
}
→ Ссылка