Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,160
1

Как НЕ показывать контекстное меню

20.06.2014, 21:36. Просмотров 3057. Ответов 13
Метки нет (Все метки)


Добрый день!

Привязал контекстное меню (щелчок правой кнопкой мышки) к DataGridView. Это контекстное меню отображается, даже если DataGridview пустой. Как сделать проверку, что если DataGridView пустой, то вообще не отображать контекстное меню?

Добавлено через 22 минуты
При этом элементы контекстного меню уже созданы, там много разных прописанных параметров, так что вариант "создавать новое контекстное меню при нажатии правой кнопки мышки" не очень подходит.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2014, 21:36
Ответы с готовыми решениями:

Как создать контекстное меню. Например нажимая на richTextBox правой кнопкой мыши, мне бы предоставлялось контекстное меню
Как создать контекстное меню. Например нажимая на richTextBox правой кнопкой мыши, мне бы...

panel, как контекстное меню
подскажите, не могу разобраться: имеется panel, нужно, чтобы она исчезала при клике курсора (когда...

Как запретить контекстное меню в WebBrowser?
Не подскажите. как можно отключить клик правой кнопки мыши. Например у меня подгружается ролик с...

Как создать контекстное меню и привязать его к контроллу
Ребят, помогите создать контекстное меню! У меня задание рассчитать стоимость натяжных потолков, я...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
13
984 / 882 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
20.06.2014, 22:13 2
У ContextMenuStrip событие Opening, а вот с древним ContextMenu придётся наследоваться и пытаться что-то прикрутить ручками, судя по всему.
0
Life Builder
525 / 492 / 373
Регистрация: 12.01.2011
Сообщений: 1,723
20.06.2014, 22:41 3
Это конечно не совсем правильно(т. е. событие не правильная), но можно вот так
C#
1
2
3
4
private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
        {
            dataGridView1.ContextMenuStrip = dataGridView1.RowCount <= 0 ? new ContextMenuStrip() : contextMenuStrip1;
        }
0
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,160
20.06.2014, 22:51  [ТС] 4
sk007,

Спасибо, принцип понятен. Но получается, что код будет отрабатывать при каждом движении мышкой. Я, наверное, лучше сделаю привязки к функции, заполняющей DataGridView: если после работы функции были добавлены ряды, то назначить основное меню, а иначе - назначить пустое.
0
Life Builder
525 / 492 / 373
Регистрация: 12.01.2011
Сообщений: 1,723
21.06.2014, 01:12 5
Цитата Сообщение от Suppir Посмотреть сообщение
Но получается, что код будет отрабатывать при каждом движении мышкой.
И я этого имел ввиду. Когда написал:
Цитата Сообщение от sk007 Посмотреть сообщение
Это конечно не совсем правильно(т. е. событие не правильная)
0
1014 / 850 / 224
Регистрация: 15.06.2012
Сообщений: 3,362
Записей в блоге: 1
21.06.2014, 01:26 6
эм... лучше уже привязку к изменении коллекции строк грида...
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public partial class Form1 : Form
    {
        private ContextMenuStrip menu;
        private DataGridView grid;
 
        public Form1()
        {
            InitializeComponent();
            Size = new System.Drawing.Size(500, 400);
            Init_Grid();
            Init_FillButton();
            Init_ClearButton();
            Init_ContextMenu();
        }
 
        private void Init_Grid()
        {
            grid = new DataGridView
            {
                Width = 200,
                Height = 300,
                Location = new Point(10, 10)
            };
            grid.Columns.Add("nya", "nya");
            grid.Rows.CollectionChanged += Rows_CollectionChanged;
 
            Controls.Add(grid);
        }
 
        private void Init_ContextMenu()
        {
            menu = new ContextMenuStrip();
            menu.Items.Add("one");
            menu.Items.Add("two");
            menu.Items.Add("nya");
        }
 
        private void Init_FillButton()
        {
            var button = new Button
            {
                Width = 75,
                Height = 30,
                Text = "Fill",
                Location = new Point(220, 10)
            };
            button.Click += Fill_Grid;
            Controls.Add(button);
        }
 
        private void Init_ClearButton()
        {
            var button = new Button
            {
                Width = 75,
                Height = 30,
                Text = "Clear",
                Location = new Point(220, 50)
            };
            button.Click += Clear_Grid;
            Controls.Add(button);
        }
 
        private void Rows_CollectionChanged(object sender, CollectionChangeEventArgs e)
        {
            if (grid.Rows.Count > 0)
                grid.ContextMenuStrip = menu;
            else
                grid.ContextMenu = null;
        }
 
        private void Fill_Grid(object sender, EventArgs e)
        {
            for (int i = 0; i < 8; i++)
            {
                var row = new DataGridViewRow();
                row.CreateCells(grid, i);
                grid.Rows.Add(row);
            }
        }
 
        private void Clear_Grid(object sendet, EventArgs e)
        {
            grid.Rows.Clear();
        }
    }
два ключевых момента
C#
1
2
3
4
5
6
7
8
9
10
11
12
        //...
        // подписываемся на изменение коллекции строк
        grid.Rows.CollectionChanged += Rows_CollectionChanged;
        //...
 
        private void Rows_CollectionChanged(object sender, CollectionChangeEventArgs e)
        {
            if (grid.Rows.Count > 0) // если наш грид содержит строки
                grid.ContextMenuStrip = menu; // включаем меню
            else
                grid.ContextMenu = null; // убираем меню
        }
1
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,160
21.06.2014, 08:37  [ТС] 7
Спасибо, попробую.
0
984 / 882 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
21.06.2014, 09:41 8
Лучший ответ Сообщение было отмечено Suppir как решение

Решение

Цитата Сообщение от Suppir Посмотреть сообщение
так что вариант "создавать новое контекстное меню при нажатии правой кнопки мышки" не очень подходит
Интересно, к чему все выше написанные костыли?
C#
1
2
3
4
5
6
7
8
9
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.ContextMenuStrip.Opening += ContextMenuStrip_Opening;
        }
 
        private void ContextMenuStrip_Opening(object sender, CancelEventArgs e)
        {
            e.Cancel = dataGridView1.RowCount == 0;
        }
1
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,160
21.06.2014, 10:03  [ТС] 9
Spawn,

спасибо, тоже попробую!
0
1014 / 850 / 224
Регистрация: 15.06.2012
Сообщений: 3,362
Записей в блоге: 1
21.06.2014, 21:20 10
Spawn, разные варианты решения задачи. Что именно плохого к привязки изменения коллекции или дополнительных махинаций в добавляющих/удаляющих методах?
1
Spawn
22.06.2014, 10:56
  #11

Не по теме:

Wolfdp, гланды, говорят, тоже можно удалять с другой стороны :)

0
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,160
22.06.2014, 11:19  [ТС] 12
Кстати, у меня вопрос по этой строчке:

C#
1
 e.Cancel = dataGridView1.RowCount == 0;
Здесь вместо if (dataGridView1.RowCount == 0){e.Cancel} используется приоритет операторов?
0
Эксперт .NET
14848 / 11234 / 2948
Регистрация: 17.09.2011
Сообщений: 18,817
22.06.2014, 12:45 13
Цитата Сообщение от Suppir Посмотреть сообщение
используется приоритет операторов?
Да, у оператора присваивания самый низкий приоритет и правая ассоциативность.
0
Wolfdp
22.06.2014, 22:11     Как НЕ показывать контекстное меню
  #14

Не по теме:

Spawn, если бы было предложение по таймеру проверять наличие элементов в колеекции а потом рекурсией проходить все менюхи на форме -- я бы не спорил, это явно бред.

Порой, некоторые вещи делают так, для лучшего понимания логики работы. Например по очистке грика нужно сделать несколько действий: убрать контекстное меню, убрать справку справа, задисейблить кнопку сохранить. Логично всё это вынести в отдельный метод, а не в разброс.

0
22.06.2014, 22:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 22:11
Привет! Вот еще темы с ответами:

Как определить к какому Treenode относится контекстное меню
у меня есть TreeView. Во время выполнения программы туда добавляются treenode которым присваивается...

Как отобразить контекстное меню для иконки в трее?
Добрый день! Подскажите пожалуйста, как запустить контекстное меню трея во время работы...

Как кастомизировать контекстное меню для различных обьектов?
Привет всем джедаям! Прошу помощи, с такой проблемой, имеем Form1 с 5-ю pictureBox каждый из...

Как подключить контекстное меню к динамически созданному компоненту
Весь вопрос в заголовке Я делаю так : PictureBox.ContextMenu = contextMenuStrip1; Сама ошибка:...


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

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

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