Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Demonikaliysis
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
1

Выделение редактируемой строки DataGridView

14.09.2015, 12:06. Просмотров 1232. Ответов 7
Метки нет (Все метки)

Здравствуйте!

Хочу сделать, чтобы даже после обновления DataGridView выделение текущей ячейки оставалось, а не перемещалось всегда на первую строку. Т.е. редактирую вторую чтобы там и осталось выделение строки, а не сбрасывалось по умолчанию на первую строку.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        DataTable dt = new DataTable();
...
dt = SELECT...
                /*Вывод данных из БД в компонент*/
                DGV_BugTrackingSystem.DataSource = dt.AsDataView();
 
                /*Выделяем всю строку*/
                DGV_BugTrackingSystem.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
 
                /*Выделение только одной строки*/
                DGV_BugTrackingSystem.MultiSelect = false;
 
                /*Держим текущую строку всегда выделенной, даже после обновления формы*/
                //DGV_BugTrackingSystem.Refresh();
                //DGV_BugTrackingSystem.Update();
                //DGV_BugTrackingSystem.RefreshEdit();
                //DGV_BugTrackingSystem.CurrentRow.Selected = true;
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2015, 12:06
Ответы с готовыми решениями:

Снять выделение строки в DataGridView
У меня в проекте на форме лежит элемент DataGridView при загрузке приложения...

Datagridview выделение последней строки
Как сделать чтобы при запуске была выделенна последння строка datagridview.

Метод определения координат(строоки и столбика) редактируемой клетки DataGridView
Какой метод(ы) возвращает(ют) координаты(индекс строоки и столбика)...

Выделение строки в DataGridView и сохранить в массив
Требуется выделить несколько строк - с сохранить выделенные строки в массив ...

Cделать выделение последней строки в Datagridview
Всем привет, подскажите пожалуйста как сделать выделение последней строки в...

7
wm_leviathan
196 / 198 / 69
Регистрация: 12.01.2011
Сообщений: 699
Завершенные тесты: 2
14.09.2015, 12:19 2
перед обновлением запоминаешь индекс выделенной строки:
C#
1
2
int currIndex = 0;
currIndex = dataGridView1.CurrentRow.Index;
потом после обновления возвращаешь индекс:
C#
1
2
3
dataGridView1.ClearSelection();
dataGridView1.Rows[currIndex].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = currIndex;
0
Demonikaliysis
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
14.09.2015, 16:23  [ТС] 3
Прошу прощения лаганул ПК и недооформил сообщение правильно.

При таком выводе
C#
1
                DGV_BugTrackingSystem.DataSource = dt.AsDataView();
такое обновление не работает

C#
1
2
3
                DGV_BugTrackingSystem.Refresh();
                DGV_BugTrackingSystem.Update();
                DGV_BugTrackingSystem.RefreshEdit();
как сделать чтобы обновлялся DataGridView при изменении данных в БД и чтобы отставалась выделенной текущая строка для редактирования?

Добавлено через 2 минуты
Цитата Сообщение от wm_leviathan Посмотреть сообщение
перед обновлением запоминаешь индекс выделенной строки:
Код C#Выделить код
1
2
int currIndex = 0;
currIndex = dataGridView1.CurrentRow.Index;
потом после обновления возвращаешь индекс:
Код C#Выделить код
1
2
3
dataGridView1.ClearSelection();
dataGridView1.Rows[currIndex].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = currIndex;

Попробовал, что-то не получилось, по логике у вас всё правильно, но что-то у меня не работает как надо.

Пометил ваш ответ в обработчик кнопки редактирования. Между вашим ответом до и после поместил сам процесс редактирования. И вот не работает...

Приведу немножечко кода (прошу прощения если не соблюдаю codeconvention, я ведь ещё junior):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
        #region _Кнопка редактировать (если это его автор и статус "Новое")
        private void buttonEditComment_Click(object sender, EventArgs e)
        {
            try
            {
                int currIndex = 0;
                currIndex = DGV_BugTrackingSystem.CurrentRow.Index;
 
                #region ПРОВЕРКА АВТОРСТВА СООБЩЕНИЯ
                if (UserID == Convert.ToInt32(DGV_BugTrackingSystem.CurrentRow.Cells[7].Value))
                {
 
                    #region Проверка текущего статуса сообщения
                    switch ((string)DGV_BugTrackingSystem.CurrentRow.Cells[5].Value)
                    {
                        case "Новое":
 
                            #region ЗАПРЕТ НА ВВОД ПУСТЫХ СООБЩЕНИЙ
                            if (textBoxComment.Text == string.Empty)
                            { MessageBox.Show("Сообщение выглядит пустым, проверьте поле для ввода сообщения"); }
                            else
                            #endregion
 
                            {
                                int idErrorMess = Convert.ToInt32(DGV_BugTrackingSystem.CurrentRow.Cells[6].Value);
                                QueriesRun.RunEditQueryStudentInfo(string.Format("UPDATE dbo.BugTrackingSystem SET Comment = '{0}', DateComment = '{1}' WHERE UserID = '{2}' AND ErrorMessID = '{3}' AND Status = 'Новое'", textBoxComment.Text, DateTime.Now, UserID, idErrorMess));
                                MessageBox.Show("Ваше сообщение успешно отредактировано.\nПомните, редактировать свои сообщения можно, только если они ещё не взяты на контроль администатором");
                            }
                            break;
 
                        case "В разработке":
                            { MessageBox.Show("Ваше сообщение находиться в разработке, редактирование невозможно"); }
                            break;
 
                        case "Сделано":
                            { MessageBox.Show("Ваше сообщение уже выполненно, вы можете создать новое"); }
                            break;
                    }
                }
 
                else
                    MessageBox.Show("Нельзя редактировать чужие сообщения");
                    #endregion
 
                #endregion
 
                textBoxComment.Text = null;
                /*Держим текущую строку всегда выделенной, даже после обновления формы*/
                //DGV_BugTrackingSystem.Refresh();
                //DGV_BugTrackingSystem.Update();
                //DGV_BugTrackingSystem.RefreshEdit();
                //DGV_BugTrackingSystem.CurrentRow.Selected = true;  
                
                DGV_BugTrackingSystem.ClearSelection();
                DGV_BugTrackingSystem.Rows[currIndex].Selected = true;
                DGV_BugTrackingSystem.FirstDisplayedScrollingRowIndex = currIndex;
                                
                //LoadTable();
            }
 
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }
        #endregion
Добавлено через 3 часа 47 минут
Цитата Сообщение от wm_leviathan Посмотреть сообщение
currIndex = dataGridView1.CurrentRow.Index;
Как сделать чтобы было всегда выделена конкретная строка и указатель на неё, пока сам мышкой\стрелками на клавиатуре не выберешь другую?

Таким макаром, выделение остаётся, а указатель всегда сбрасывается на первую строку.
C#
1
2
3
                int currIndex = DGV_BugTrackingSystem.CurrentRow.Index; // индексируем текущую строку
...процесс обновления...
                DGV_BugTrackingSystem.Rows[currIndex].Selected = true; // выделяем проиндексированную строку
События разные datagrid попробовал тоже самое было. Нажатия и фокусы курсора перепробовал вроде бы все.
0
Zhavoronkov5
49 / 45 / 23
Регистрация: 27.07.2015
Сообщений: 112
14.09.2015, 23:15 4
Лучший ответ Сообщение было отмечено Demonikaliysis как решение

Решение

wm_leviathan, Ваш способ неверный. Выбранная ячейка (та, которая Selected) и текущая ячейка (Сurrent, та, с которой работал пользователь, напротив нее стрелочка отображается) - не одно и то же.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        //  Первой кнопкой изначально заполняем таблицу.
        private void button1_Click(object sender, EventArgs e)
        {
            BindingList<Man> people = new BindingList<Man>
            {
                new Man {name = "Кейт", surname = "Мосс"},
                new Man {name = "Кара", surname = "Делевинь"},
                new Man {name = "Роуз", surname = "Хантингтон-Уайтли"}
            };
            dataGridView1.DataSource = people;
        }
 
        //  Выделяем какую-то строку и нажимаем вторую кнопку.
        private void button2_Click(object sender, EventArgs e)
        {
            //  Запоминаем строку, которую выбрал пользователь.
            int currRowIndex = dataGridView1.CurrentCell.RowIndex;
            
            //  Обновляем таблицу.
            BindingList<Man> people2 = new BindingList<Man>
            {
                new Man {name = "Арнольд", surname = "Шварценеггер"},
                new Man {name = "Сильвестр", surname = "Сталлоне"},
                new Man {name = "Стивен", surname = "Сигал"}
            };
            dataGridView1.DataSource = people2;
 
            //  Выбираем нашу строку (именно выбираем, не выделяем).
            dataGridView1.CurrentCell = dataGridView1[0, currRowIndex];
        }
    }
 
    public class Man
    {
        public string name { get; set; }
        public string surname { get; set; }
    }

Не по теме:

Вообще компонент DataGridView - кривой до невозможности. На мой взгляд.

1
Demonikaliysis
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
14.09.2015, 23:55  [ТС] 5
Я понимаю что такое текущая и что такое выделенная. Проблема в их корректном совмещении и работе. Вернее он то совмещает после обновления формы и всё бы хорошо, если бы это не была всегда строка номер 1 =(
0
Zhavoronkov5
49 / 45 / 23
Регистрация: 27.07.2015
Сообщений: 112
15.09.2015, 00:06 6
Свойство CurrentRow кривоватое. Попробуйте через currentCell, как я написал.

А с переменной, где индекс храните, все ок? В дебаггере смотрели?
0
Demonikaliysis
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
15.09.2015, 00:09  [ТС] 7
Чем же оно кривоватое?

Я и через строку и через ячейку потом сообразил все равно. Если индексация строки после функции обновления, тогда работает всё но только с 1й строкой, а нужно чтобы с какой-то конкретно выделенной, может быть событие на форме, но там столько что запутаться можно основные попробовал.

Вот этого не знаю, попробую. Шагал, вроде бы как надо было.
0
Demonikaliysis
0 / 0 / 1
Регистрация: 20.07.2015
Сообщений: 63
15.09.2015, 10:34  [ТС] 8
Решилось таким образом:
0
Миниатюры
Выделение редактируемой строки DataGridView  
15.09.2015, 10:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2015, 10:34

DataGridView - обрабатывать выделение только одной строки
Здравствуйте. У меня на форме есть датагрид, по событии SelectionChanged я...

Выделение строки в Datagridview в зависимости от текста в ячейке
Как сделать выделение строки (к примеру,в красный цвет) datagridview в...

Выделение всей строки в DataGridView и закрашивание ее цветом
Здравствуйте! Существует следующий код private void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru