Как сделать неактивной кнопку на menustrip
Я не могу найти способ добавить горизонтальный разделитель в MenuStrip. Visual Studio жалуется, что не удается добавить ToolStropSeparator в MenuStrip.
есть идеи, как я могу это сделать?
Я могу запустить такой код:
без каких-либо проблем. Какую ошибку вы получаете?
в пространстве между двумя полями, разделенными разделителем, введите:
затем нажмите enter (в конструкторе)
вы можете щелкнуть правой кнопкой мыши menustrip, затем 'Insert' - > 'Separator'. Вот и все.
шагов: 1. щелкните правой кнопкой мыши на элементах contextmenuStrip - > Insert - > Separator
a) нажмите (введите текстовое поле для ContextMenuStrip), где вы хотите поместить горизонтальный разделитель, затем введите " - " (знак минус) b) ввод надеюсь, это вам пригодится:)
Мне нравится делать мое С-а не разделителем. Скажем, я хочу сделать горизонтальный разделитель, я бы сделал около 30 из них, чтобы создать горизонтальную пунктирную линию длиной 30. Затем я бы установил его свойство enabled в false, чтобы его нельзя было щелкнуть как для вертикального. Просто сделайте / затем ваш элемент для каждого элемента, и вы заметите, что он создаст вертикальную линию, соответствующую каждому элементу. [Примечание] вертикальная линия будет пунктирной из-за расстояния между каждым элементом.
щелкните правой кнопкой мыши значок полосы контекстного меню. затем выберите Вставить и после выберите разделитель/
нет разделителей для элементов полосы меню.
вы можете выбрать элемент, который вы хотите пробел между, и установить значение левого или правого поля. Это работает так же хорошо.
Всем осветительный привет! Мы продолжаем изучать формы Windows и сегодня мы будем учится запускать новую форму из окна основной, а также рассмотрим такие элементы, как ListBox и MenuStrip.
Начнём с того, что будем создавать обычное меню, которое можно наблюдать в стандартных окнах. Для этого найдите компонент MenuStrip и переместите его в макет программы:
По-умолчанию меню выводится сверху, как видно на рисунке выше. Это визуальный редактор меню. В поле "Вводить здесь" нам предлагают ввести имя ячейки каждого пункта нашей навигации. При нажатии на элемент в нас выскакивают дополнительные места для будущих команд:
Соответственно всё, что будет написано справа будет горизонтальной навигацией, а что внизу - подпункты выделенной категории. Для начала создадим 3 пункта меню: "Файл", "Команды" и "Справка". В меню файл создадим 2 пункта: "Сохранить HTML" и "Выход":
В меню "Команды" добавим только 1 пункт - "История", а в Справку закинем "Об авторе" и "О программе".
Наше меню готово, осталось только написать логику этих пунктов. Но прежде всего предлагаю сместить объект кнопка, браузер и ТекстБокс на небольшое расстояние от панели меню. Если это сделать, то получится эффект, когда меню частично закрывает кнопку и поле ввода, что намекает на криворукость программиста Думаю при компиляции без изменений сразу будет видим этот эффект. Ваша задача - подкорректировать элементы макета под более удобный вид.
В этом уроке мы рассмотрим выполнение 2-х функций - "Выход" и "История". Знаю, что выйти с программы можно и нажав красный крестик, но я предлагаю сделать это программно, вдруг кому-то пригодится Мы должны сделать обработчик события "Клик" по пункту меню. Два раза нажимаем ЛКМ по нужной ячейке меню, чтобы компилятор автоматически создал подписку и обработчик события:
и в обработчике пишем всего одну команду:
С историей посещённый сайтов немного сложнее. Здесь есть куда разный вариантов. Я предлагаю немного усовершенствовать библиотеку, которую мы создали в предыдущем уроке.
Заходим в проект BrowserLib и нажимаем комбинацию CTRL + SHIFT + A , и добавляем новую форму, назвав её, например, History:
Теперь мы можем визуализировать нашу новую форму. Предлагаю эту форму сделать фиксированной, размером 400х350, режим авто-размера: GrowAndShrink. Добавим туда новый компонент - ListBox и разместим его на форме. Добавим ещё 2 кнопки: "удалить запись", "очистить". Если пользователь нажмёт 2 раза ЛКМ по элементу списка, то браузер перейдёт по сохранённой ссылке. Кроме этого создадим лейбл, который будет иметь имя "Нет". Этот компонент будет отображать дату записи, которую мы указали в момент добавления записи лога. В итоге мы должны получить такое окно:
ListBox сам-по-себе не очень сложный в освоении, и очень поход на обычные списки, только в визуальном оформлении. Прежде всего нужно заполнить список информацией. По-задумке, в форму будет передан некий массив строк с которых будет формироваться список. Перейдём в режим редактирования(клавиша F7). В конструктор впишем аргумент - string[] LINKS. Чтобы мы могли выводить дату, мы должны хранить её где-нить, по-этому предлагаю добавить private поле со списком:
Так, как одна из функций данного окна является переход по ссылке, мы должны вернуть эту ссылку в виде строки. Пишем:
public History( string[] LINKS ) <
InitializeComponent();
if ( LINKS == null ) button1.Enabled = false;
button2.Enabled = false;
return;
>
foreach ( string Temp in LINKS ) string[] s = Temp.Split( '|' );
DATE.Add(s[0]);
listBox1.Items.Add(s[1]);
>
>
Рассмотрим первый блок. По логике, если нам передали пустой или несуществующий массив, то значит никаких ссылок в логе у нас нет. По этому все действия будут бесполезны, по этому зададим активность наших кнопок в режим "спячки" и сражу же выходим с конструктора с помощи return. Если массив всё-таки существует и имеет записи, то условие не выполняется и идёт второй блок. Мы в цикле обходим все строки в массиве. Каждую строчку мы разделяем сепаратором Split( '|' ) . Суть этого метода в том, что он берёт каждую подстроку и записывает в массив, каждая строка является новым элементом. То есть если у нас есть строка "111|222|333|444|555", то на выходе мы получим массив с элементами:
Символ '|' является сепаратором и в массив не входит. Так как наша строка имеет всего один символ сепаратора, то на выходе мы получим массив с 2-х элементов: даты и ссылки. Нулевой элемент мы запишем в список DATE, а первый в ListBox.
Процесс заполнения окончен.Дальше уже идёт реализация. Создадим обработчик события для кнопки "Удалить запись". Прежде всего нам необходимо узнать текущий выбранный элемент:
Так, как мы должны удалить и в списке дат элемент, то более оптимально будет вынести индекс в переменную, чтобы не делать лишних запросов:
int Index = listBox1.SelectedIndex;
listBox1.Items.RemoveAt( Index );
DATE.RemoveAt( Index );
listBox1.SelectedIndex = 0;
Однако есть исключение - нельзя отнимать несуществующие элементы, по этому мы должны поставить условия, что если к-во элементов списка больше нуля, то удалять, иначе отключим кнопки:
private void button2_Click( object sender, EventArgs e ) <
if ( listBox1.Items.Count > 0 ) int Index = listBox1.SelectedIndex;
listBox1.Items.RemoveAt( Index );
DATE.RemoveAt(Index);
if ( 1 > listBox1.Items.Count ) button1.Enabled = false;
button2.Enabled = false;
>
> else button1.Enabled = false;
button2.Enabled = false;
>
>
Процесс очистки всех элементов ещё проще. Можно конечно было бы делать циклы и тому подобное, но Майкрософт уже сделали это за нас, создав отличный метод очистки:
private void button1_Click( object sender, EventArgs e ) <
listBox1.Items.Clear();
DATE.Clear();
button1.Enabled = false;
button2.Enabled = false;
>
Итак, мы научили список удалятся 2-мя способами: по одному и всё вместе. Он умеет получать данные из вне. Теперь разберёмся с датами. Здесь проще простого. Выбираем наш список в макете программы и ищем событие SelectedIndexChanged, жмём 2 раза на поле и получаем обработчик события:
Этот блок рекомендую брать в блок try, так как индекс после удаления очищается.
private void listBox1_SelectedIndexChanged( object sender, EventArgs e ) <
try label1.Text = DATE[ listBox1.SelectedIndex ].ToString();
> catch label1.Text = "НЕТ";
>
>
Итак, у нас теперь теперь осталась одна задача - переход на ссылке по двойному клику в списке. Здесь тоже нет ничего сложного - наша форма этого делать не будет, это осуществит dll-библиотека, а мы должны только передадим нужное значение. Опять переходим в события ЛистБокса и выбираем событие "DoubleClick". В обработчике пишем следующий текст:
private void listBox1_DoubleClick( object sender, EventArgs e ) <
retLink = listBox1.Items[ listBox1.SelectedIndex ].ToString();
Close();
>
Суть в том, что мы передаём через публичную переменную ссылку а затем просто закрываем форму, используя процедуру Close().
Казалось весь функционал формы уже сделан, но есть один интересный факт: удаляли мы только со списка, но не с файла. Нам нужно осуществить перезапись файла. Это делается не очень сложно. Для начала зайдём в события самой формы и выбираем "FormClosing". Это событие возникает перед самим закрытием формы, а не после, дающий возможности воспользоваться данными формы:
private void History_FormClosing( object sender, FormClosingEventArgs e ) <
string text = "";
int j = DATE.Count;
if ( j > 0 ) for ( int i = 0; i
>
Если к-во элементов списка больше нуля, то идёт цикл, который прибавляет строку с нужным форматом к переменной text. Дальше идёт переход к записи файла. Если есть записи, то запишутся все. Если нет, то файл будет только пустым.
На этом мы завершаем проектировать форму и переходим к dll-ке. Добавим новый статический метод:
Всем привет. Речь конечно же пойдет о кнопке на странице сайта или какого-то веб-приложения. Мы будем делать ее неактивной через JS, но для этого нам нужно создать условие, то есть в каких случаях кнопка будет неактивной, потому что оставлять ее в этом положении навсегда не имеет смысла. В большинстве случаев это делается при проверке каких-то данных в форме и там как раз есть условие — если проверка на заданные условия пройдена, то кнопку сделаем активной, если нет — нажатие на кнопку будет запрещено. Я уже писал про валидацию номера телефона на JS, поэтому мы можем частично воспользоваться кодом, который приведен в статье. неактивная кнопка а HTML выглядит так:
То есть кнопке просто добавляется атрибут disabled и дальше будет зависеть от контекста. В каких случаях атрибуту присваивать значение TRUE, а в каких FALSE. Теперь можно перейти к конкретным примерам.
Соответственно сделать кнопку неактивной на JS можно и для других данных, когда форма содержит гораздо больше полей и все их нужно проверить. В этом уроке я привел основной принцип, а реализация и проверки будут зависеть от конкретной задачи.
Читайте также: