powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Область отсечения по ячейке DataGridView
5 сообщений из 5, страница 1 из 1
Область отсечения по ячейке DataGridView
    #40098627
kab19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В DataGridView имеется колонка с ComboBox'ами. Необходимо задать область отсечения (Cursor.Clip) по ячейке из
этой колонки при ее редактировании. Пробовал двумя способами: через событие CellPainting и через событие Enter,
которое происходит при редактировании ComboBox'а из столбца (посредством события EditingControlShowing).

Через событие CellPainting:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        private void dataGridView3_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (DGV_CmbEditing)
            {
                int Left, Top, Width, Height;
                Left = this.Left + tabControl1.TabPages[1].Left + dataGridView3.Left + 811;
                Top = this.Top + this.FontHeight + tabControl1.ItemSize.Height + tabControl1.TabPages[1].Top + dataGridView3.Top + e.CellBounds.Y + 13;
                Cursor.Position = new Point(Left, Top);
                Left = this.Left + tabControl1.TabPages[1].Left + dataGridView3.Left + 600;
                Top = this.Top + this.FontHeight + tabControl1.ItemSize.Height + tabControl1.TabPages[1].Top + dataGridView3.Top + e.CellBounds.Y;
                Width = e.CellBounds.Width;
                Height = e.CellBounds.Height;
                this.Cursor = new Cursor(Cursor.Current.Handle);
                Cursor.Clip = new Rectangle(Left, Top, Width, Height);
                DGV_CmbEditing = false;
            }
        }



Через событие Enter:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        private void DGV_TextBox_Enter(object sender, EventArgs e)
        {
            ComboBox cmb_box = sender as ComboBox;
            int Left, Top, Width, Height;
            Left = this.Left + tabControl1.TabPages[1].Left + dataGridView3.Left + 600;
            Top = this.Top + this.FontHeight + tabControl1.ItemSize.Height + tabControl1.TabPages[1].Top + dataGridView3.Top + cmb_box.Bounds.Y;
            Width = cmb_box.Bounds.Width;
            Height = cmb_box.Bounds.Height;
            this.Cursor = new Cursor(Cursor.Current.Handle);
            Cursor.Clip = new Rectangle(Left, Top, Width, Height);
        }



В обоих случаях алгоритм работает, если число прибавляемое к координате Left+= 600, но координаты отсечения тогда не
попадают на нужную ячейку. Если увеличивать слагаемое до 700 и выше программа ведет себя так как будто отсечения области
курсора нет совсем.
...
Рейтинг: 0 / 0
Область отсечения по ячейке DataGridView
    #40098628
kab19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Область отсечения по ячейке DataGridView
    #40098732
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть экранные координаты, есть клиентские координаты. Возможно, проблема в них.
В разных местах используются те или иные. Нужно их пересчитывать по необходимости.

Смотри методы PointToScreen, RectangleToScreen, PointToClient, RectangleToClient.
...
Рейтинг: 0 / 0
Область отсечения по ячейке DataGridView
    #40099132
kab19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petalvik,
Немного причесал код, но проблема осталась та же. Есть предположение, что проблема в том, что при редактировании ячейки DataGridView создается отдельный компонент ячейки, которая отображается поверх редактируемой и с которой работает EditingControlShowing. Как только курсор заходит на координаты новой ячейки он попадает в область нового компонента и для него перестают работать настройки курсора предыдущего компонента. Может у кого есть идеи как это исправить?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private void dataGridView3_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{           
   if (DGV_CmbEditing)
   {
	Point PointOnCell = new Point();
	PointOnCell.X = 810;
	PointOnCell.Y = this.Top + e.CellBounds.Y + 10;
	Cursor.Position = PointToScreen(PointOnCell);

	Rectangle CellRect = new Rectangle();
	CellRect.X = 600;
	CellRect.Y = this.Top + e.CellBounds.Y;
	CellRect.Width = e.CellBounds.Width;
	CellRect.Height = e.CellBounds.Height;
	this.Cursor = new Cursor(Cursor.Current.Handle);
	Cursor.Clip = RectangleToScreen(CellRect);

	DGV_CmbEditing = false;
   }
}
...
Рейтинг: 0 / 0
Область отсечения по ячейке DataGridView
    #40099154
kab19
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дальнейшем выяснилось, что отсечение не работает вообще во всей программе и без каких либо условий. Вариант в первом сообщении работал, но не попадал в нужную ячейку. Увеличение координаты Х ведет к тому, что отсечение просто не срабатывает. Есть подозрения, что дело в настройках формы.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Область отсечения по ячейке DataGridView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]