Сохранение состояния флажков при фильтрации записи с использованием текстового поля - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над приложением на C # для заполнения записей из SQL Server в представление сетки данных, с возможностью динамического чекбокса в каждой строке.Я хочу выбрать выбранные строки для какой-либо цели через флажок этой конкретной строки.До сих пор я успешно достигал своей цели, но столкнулся с незначительной проблемой, связанной с сохранением проверенного статуса.

Например, я хочу проверять только те записи, имя которых = Макс.У меня есть текстовое поле в этом текстовом поле. Я вызываю событие изменения текста с помощью запроса типа:

 try
    {
        SqlCommand cmd = null;
        SqlConnection con = null; Ranks rank = new Ranks();
        con = new SqlConnection(cs.DBcon);
        con.Open();
        cmd = con.CreateCommand();
        cmd.CommandText = "Select * from Records where Name like @Name order by Pno";
        cmd.Parameters.AddWithValue("@Name", "%" + FilterByNameTextbox.Text.Trim() + "%");
        SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        adapter1.Fill(dt);

        dataGridView1.DataSource = dt;
        Make_fields_Colorful();
    }
    catch (Exception exception)
    {
        MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    }

Если я напишу Max в текстовом поле фильтра по имени, он вернет 3 записи с именем, начинающимся с max, используя запрос как я упоминалкод выше.Поэтому я проверяю только 2 записи из 3, используя динамический флажок, до сих пор мой код работает отлично.Теперь я хочу проверить записи, имя которых начинается с Ali, теперь, когда я пишу ali в моем фильтре по текстовому полю name, он будет возвращать строки, имена которых похожи на ali, но здесь возникает проблема, поэтому я удаляю мои предыдущие проверенные записи, поэтому, как бы я могсохранить проверенные записи для строк max и ali:

Код для добавления динамических флажков в каждой строке

DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
    checkBoxColumn.Name = "checkBoxColumn";
    checkBoxColumn.DataPropertyName = "Report";
    checkBoxColumn.HeaderText = "Report";
    dataGridView1.Columns.Insert(10, checkBoxColumn);
    dataGridView1.RowTemplate.Height = 100;
    dataGridView1.Columns[10].Width = 50;

Изображения:

Изображение 1

Изображение 2

1 Ответ

0 голосов
/ 12 февраля 2019

Я предлагаю вам достичь этого путем кэширования выбранных строк, сначала у вас должен быть список кэшированных строк:

List<DataGridViewRow> CachedRows = new List<DataGridViewRow>();

, затем добавьте обработчик событий при изменении значения ячейки, как показано ниже:

dataGridView1.CellValueChanged += view_CellValueChanged;

, и обработчик должен проверить, является ли измененный столбец флажком и установлен ли он, и должен выглядеть примерно так:

try
{
    if(e.ColumnIndex == indexOfCheckBoxColumn)
    {
       if((bool)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == true)
       {
        CachedRows.Add((DataGridViewRow)dataGridView1.Rows[e.RowIndex].Clone());
       }
       else if (CachedRows.Contains(dataGridView1.Rows[e.RowIndex]))//Validate if this works, if not you should associate each row with unique key like for example (id) using a dictionary
       {
          CachedRows.Remove(dataGridView1.Rows[e.RowIndex]);
       }
    }
}
catch(Exception ex)
{
}

, затем после изменения фильтра снова добавьте кэшированные строки, поэтому кодстановится:

try
    {
        SqlCommand cmd = null;
        SqlConnection con = null; Ranks rank = new Ranks();
        con = new SqlConnection(cs.DBcon);
        con.Open();
        cmd = con.CreateCommand();
        cmd.CommandText = "Select * from Records where Name like @Name order by Pno";
        cmd.Parameters.AddWithValue("@Name", "%" + FilterByNameTextbox.Text.Trim() + "%");
        SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        adapter1.Fill(dt);

        dataGridView1.DataSource = dt;
        //add folowing
        if (CachedRows.Any())
        {
            dataGridView1.Rows.AddRange(CachedRows.ToArray());
            CachedRows.Clear();
        }
        Make_fields_Colorful();
    }
    catch (Exception exception)
    {
        MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...