powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Доступность Control'a
10 сообщений из 10, страница 1 из 1
Доступность Control'a
    #38846795
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Появилась необходимость вычислять "доступен" ли контрол для пользователя. Под доступностью контрола понимается возможность пользователю видеть его и внести туда данные. Будем считать, что сам контрол не ReadOnly и Visible. Для примера есть TabControl с двумя страницами, на каждой из которых TextBox. И если выбрана первая страница TabControl, то второй TextBox недоступен, а первый - доступен. Если вторая, то наоборот.
Может быть вариант что контрол находится на Panel у которой Visible=False, тогда контрол тоже будет не доступен. Понятно что можно написать проверки для каждого такого случая, но быть может есть какой-то более универсальный способ узнать "прорисован" ли контрол в видимой части формы.
Нашел вот такой код:
Код: 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.
   [DllImport("user32.dll")]
        static extern IntPtr WindowFromPoint(POINT Point);

        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;

            public POINT(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }

            public static implicit operator System.Drawing.Point(POINT p)
            {
                return new System.Drawing.Point(p.X, p.Y);
            }

            public static implicit operator POINT(System.Drawing.Point p)
            {
                return new POINT(p.X, p.Y);
            }
        }

        public static bool IsControlVisibleToUser(this Control control)
        {
            var pos = control.PointToScreen(control.Location);
            var pointsToCheck = new POINT[]
                                {
                                    pos,
                                    new Point(pos.X + control.Width - 1, pos.Y),
                                    new Point(pos.X, pos.Y + control.Height - 1),
                                    new Point(pos.X + control.Width - 1, pos.Y + control.Height - 1),
                                    new Point(pos.X + control.Width/2, pos.Y + control.Height/2)
                                };

            foreach (var p in pointsToCheck)
            {
                var hwnd = WindowFromPoint(p);
                var other = Control.FromChildHandle(hwnd);
                if (other == null)
                    continue;

                if (control == other || control.Contains(other))
                    return true;
            }

            return false;
        }


В нем на сколько я понял через WinAPI проверяется какой контрол находится по координатам исходного. Но вот для примера с TabControl он не сработал. В аттаче как раз проект с реализацией этого кода
...
Рейтинг: 0 / 0
Доступность Control'a
    #38846846
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тройка
Код: c#
1.
 [DllImport("user32.dll")]


ещё один7 пациент
...
Рейтинг: 0 / 0
Доступность Control'a
    #38846864
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Тройка,

А зачем все эти телодвижения? Ну не видно контрола да и не видно.
...
Рейтинг: 0 / 0
Доступность Control'a
    #38846995
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тройка,

Это у вас не система контроля доступа? Что вы хотите делать, когда узнаете что контрол доступен?

Если проверять, можно ли его показать конкретному пользователю и закрыть контрол если пользователь не имеет на него разрешение, то надо делать наоборот....
:-)

В вашей аппликации вы должны точно знать, что видимо, что не видимо, и в какой момент.
Припарки из АПИ - это для работы с кодом, который не ваш, и его нельзя изменить или расширить....
...
Рейтинг: 0 / 0
Доступность Control'a
    #38847038
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Тройка,

Это у вас не система контроля доступа? Что вы хотите делать, когда узнаете что контрол доступен?

Если проверять, можно ли его показать конкретному пользователю и закрыть контрол если пользователь не имеет на него разрешение, то надо делать наоборот....
:-)

В вашей аппликации вы должны точно знать, что видимо, что не видимо, и в какой момент.
Припарки из АПИ - это для работы с кодом, который не ваш, и его нельзя изменить или расширить....

Все практически с точностью да наоборот) Есть форма на которую динамически будут подгружаться контролы. Контролы эти будут пользовательские и будут иметь признак являются ли они обязательными для ввода. Поэтому для дополнительной(!) проверки я подумал, что быть может имеет смысл проверить что если контрол "доступен" для ввода и является обязательным, то он не может остаться с пустым значением. Но если на основе "интерфейсной ситуации" обязательный контрол оказался не доступен (например, на неактивной вкладке TabControl), то он не должен требовать ввода значения.
...
Рейтинг: 0 / 0
Доступность Control'a
    #38847047
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть пользователь переключил закладку и ОПА - обязательные поля стали необязательными )))
...
Рейтинг: 0 / 0
Доступность Control'a
    #38847055
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТо есть пользователь переключил закладку и ОПА - обязательные поля стали необязательными )))
С другой стороны TabControl может быть от девэкспреса с ShowTabHeader= false, когда пользователь не может сам перещелкнуть закладку. А закладки меняется в зависимости от соседнего CheckBox'a. К сути вопроса это особого отношения не имеет.
...
Рейтинг: 0 / 0
Доступность Control'a
    #38847057
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТройкаD129Тройка,

Это у вас не система контроля доступа? Что вы хотите делать, когда узнаете что контрол доступен?

Если проверять, можно ли его показать конкретному пользователю и закрыть контрол если пользователь не имеет на него разрешение, то надо делать наоборот....
:-)

В вашей аппликации вы должны точно знать, что видимо, что не видимо, и в какой момент.
Припарки из АПИ - это для работы с кодом, который не ваш, и его нельзя изменить или расширить....

Все практически с точностью да наоборот) Есть форма на которую динамически будут подгружаться контролы. Контролы эти будут пользовательские и будут иметь признак являются ли они обязательными для ввода. Поэтому для дополнительной(!) проверки я подумал, что быть может имеет смысл проверить что если контрол "доступен" для ввода и является обязательным, то он не может остаться с пустым значением. Но если на основе "интерфейсной ситуации" обязательный контрол оказался не доступен (например, на неактивной вкладке TabControl), то он не должен требовать ввода значения.

Для динамической подгрузки в стиле - это "берем, а это сейчас берем а потом нет " - атрибуты.

Атрибут это класс, который может обеспечить поведение, зависимое от внешних условий.

Еще один путь - это интерфес, который будет называться (напрмер) "IShouldBeFilledOut" - и дальше будет вызываться всегда, при закрытии, например, и каждая реализация будет сигналить по необходимости.

Есть еще всякие готовые штуки - типа ErrorProvider (не помню точно как там в винформах) - тоже может подойти. Там уже и визуализация есть....
...
Рейтинг: 0 / 0
Доступность Control'a
    #38847479
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ТройкаПоэтому для дополнительной(!) проверки я подумал,
Ну фу, от сердца отлегло. А то я подумал было уже, что началось восстание машин!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Доступность Control'a
    #39439310
Тройка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, прям ностальгия пробрала)) А всего то надо было найти свойство CanSelect в System.Windows.Forms.Control. Может кому-то пригодится тоже. И кстати, проект живет и работает на этой штуке весьма хорошо и очень удобно))
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Доступность Control'a
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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