Изменение значений DataGridView, при сортировке в WindowsForm

434
18 ноября 2021, 23:10

Есть следующий код:

private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < dataGridView1.Columns.Count; i++)//Прохожу по таблице в поиске выделенных ячеек
        {
            for (int j = 0; j < dataGridView1.Rows.Count; j++)
            {
                if (dataGridView1[i, j].Selected == true)
                {
                    list2.AddLast(dataGridView1[i, j]);
                }
            }
        }
        foreach (DataGridViewCell cell in list2)//Меняю значения на ок
        {
            cell.Value = "ok";
        }
        dataGridView1.CurrentCell = null;
        dataGridView1.Refresh();
    }

По нажатию на кнопку, я прохожу по все DataGridView в поиске ячеек, чей Selected == true. После добавляю их в LinketList list2. После, через foreach по коллекции и меняю value на "ок" Проблема в том, что если не сортировать DataGridView по нажатию на заголовок, то все выделенные ячейки меняют свое значение. Но, если отсортировать DataGridView по нажатию на заголовок столбца, значения ячеек перестают корректно меняться. В чем может быть проблема?

P.S.: Так же пробовал получать коллекцию ячеек, через SelectedCells и через DataTable.Selcted() получать строку по первичному ключу выделенной ячейки и менять значение в этой строке на "ОК". И это, тоже не сработало!

К тому же ,что в первом, что во втором случае иногда происходит System.ArgumentOutOfRangeException по индексу. По какому индексу и как можно выйти за предел индекса при коллекции существующих ячеек, я не понимаю.

dt = (DataTable)dataGridView1.DataSource;
foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
        {
            DataRow[] dw = dt.Select("Айди = " + dataGridView1[0, cell.RowIndex].Value.ToString());
            dt.Rows[cell.RowIndex][dataGridView1.Columns[cell.ColumnIndex].Name.ToString()] = "OK";
        }
Answer 1

сделай так

static public class DataGridExtension 
    {
        static public List<DataGridViewCell> Cells(this DataGridView view) 
        {
            var rows = ((IEnumerable<DataGridViewRow>)view.Rows);
            var result = new List<DataGridViewCell>();
            rows.ToList().ForEach(row => result.AddRange((IEnumerable<DataGridViewCell>)row.Cells));
            return result;
        }
        static public void SetCellValue(this DataGridView grid,  Func<DataGridViewCell, bool> condition, object value)
        {
            grid.Cells().ForEach(v => { if (condition(v)) v.Value = value; });
        }
    }

private void button1_Click(object sender, EventArgs e)
{
    dataGridView1.SetCellValue(c => c.Selected, "ОК");
}
READ ALSO
Вращение изображения c#

Вращение изображения c#

Всем привет, Сразу к делу : Моя задача вращать картинку в pictureBox (есть ракета, она должна плавно отклоняться на угол от -30° до 30° в зависимости...

101
Работа с mysql c#

Работа с mysql c#

ПодскажитеЯ кодил в большинстве случаях на php и в основном на yii2

194
Обработка событий в MVVM

Обработка событий в MVVM

Моя цель - обработать событие загрузки приложения, при этом применяя паттерн MVVM

183
Установка image через Uri Xamain

Установка image через Uri Xamain

Есть приложение написанное на C# Xamarin (Android, IOS)Необходимо показывать изображение которое распологается на сайте

139