Adnan Maruf Ответов: 1

C# как сделать так, чтобы кнопка winform включалась/отключалась с помощью usercontrol ?


Итак, у меня есть form1 с некоторыми кнопками,такими как button1, button2...и т. д., а также есть UserControl1 с panel1 и panel2. Обе эти панели содержат свои собственные кнопки и текстовые поля. Я могу добавить этот UserControl1 на панель form1 всякий раз, когда я нажимаю кнопку button1 на form1, и могу показать эти панели UserControl1 динамически, используя свойство panel visible, установленное в true/false, нажав на кнопку на UserControl1

Теперь я хочу, чтобы это свойство form1 button2 enable было установлено в true/false на основе видимого свойства панели UserControl1.

Предположим, здесь я хочу включить кнопку form1 button2, когда панель UserControl1 видна, и отключить, когда она не видна.

Что я уже пробовал:

В настоящее время я застрял с этой проблемой и не могу понять, как это сделать!

Я относительно новичок в C#, так что любая помощь будет оценена с большим уважением, спасибо

Maciej Los

Если вы в состоянии установить Файл usercontrol1 visible=true на Button1_Click событие, то вы можете установить Button2.Enabled=false в том же событии.

1 Ответов

Рейтинг:
8

OriginalGriff

ОК. Это не так уж сложно: все, что вам нужно сделать, это создать событие в вашем UserControl, которое обрабатывается вашей формой. Звучит сложно? Это не совсем так.
В свой пользовательский элемент управления добавьте этот код:

/// <summary>
/// Event to indicate VisibiltyChanged
/// </summary>
public event EventHandler VisibilityChanged;
/// <summary>
/// Called to signal to subscribers that VisibiltyChanged
/// </summary>
/// <param name="e"></param>
protected virtual void OnVisibilityChanged(EventArgs e)
    {
    EventHandler eh = VisibilityChanged;
    if (eh != null)
        {
        eh(this, e);
        }
    }

Теперь, когда вы изменили видимость панели внутри UserControl, просигнализируйте об этом событии:
OnVisibilityChanged(new EventArgs());
Добавьте свойство к вашему UserControl, которое позволяет внешнему миру узнать, какова видимость в данный момент:
public bool IsVisible { get { return myPanel.Visible; }}
И справьтесь с этим событием в своей форме.
При вызове обработчика используйте следующую информацию:
void myUserControl_VisibilityChanged(object sender, EventArgs e)
    {
    myUserControl mc = sender as MyUserControl;
    if (mc != null)
        {
        MyButton.Enabled = mc.IsVisible;
        }
    }


Maciej Los

Хорошо объяснил!

Adnan Maruf

@OriginalGriff сэр, спасибо за ваши добрые инструкции. Я не знаю почему, но это не работает для меня. Я мог бы напутать где-то между вашими кодами и моими кодами. Я думаю, что сделал именно то, что вы сказали, но я могу ошибаться, так как я очень новичок в C#. Вот краткое объяснение того, что я сделал->>

На файл usercontrol1
Я точно копирую-вставляю ваш код, который вы предоставляете для создания события.
Затем я добавляю:

public bool IsVisible { get { return panel2.Visible; } }


этот фрагмент кода находится чуть ниже созданного события на UserContrlo1. более конкретный

 public event EventHandler VisibilityChanged;
        protected virtual void OnVisibilityChanged(EventArgs e)
        {
            EventHandler eh = VisibilityChanged;
            if (eh != null)
            {
                eh(this, e);
            }
        }

        public bool IsVisible { get { return panel2.Visible; } }


Затем, когда я изменяю видимость панели UserControl внутри кнопки, она содержит, например, когда панель1 показывает ли тогда то событие click от кнопка 1 что находится на панель1 изменяет свойство видимости объекта панель2 в истинный а это панель2 также есть кнопка, которая элемент button2 и это так событие click изменение pane2 свойство видимости для ложный

[сторона.Примечание: пожалуйста,не путайте эти кнопки с [form1{button1, button2}] и просто чтобы очистить все это снова, я пытаюсь изменить форма 1,кнопка 2 позвольте свойству быть измененным соответственно с этим Файл usercontrol1,панель2 свойство visible]

поэтому я поставил этот код
OnVisibilityChanged(new EventArgs());
внутри дома обработчика button1_clickМероприятие на тему: Файл usercontrol1.

На форму form1.в CS [[Я думаю, что мне здесь чего-то не хватает, поэтому я поместил весь код]]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        void UserControl1_VisibilityChanged(object sender, EventArgs e)
        {
            UserControl1 uc = sender as UserControl1;
            if (uc != null)
            {
                button2.Enabled = uc.IsVisible;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            if (!mainPanel.Controls.Contains(UserControl1.Instance))
            {
                mainPanel.Controls.Add(UserControl1.Instance);
                UserControl1.Instance.Dock = DockStyle.Fill;
                UserControl1.Instance.BringToFront();
            }
            else
            {
                UserControl1.Instance.BringToFront();//
            }
           
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
    }
}



Правильно ли я все это сделал?? в любом случае спасибо за ваше время... :) !

OriginalGriff

Бит, который вы, вероятно, забыли, состоял в том, чтобы подключить событие VisibitityChanged к вашему обработчику - это происходит автоматически не больше, чем при добавлении текстового поля!

В конструкторе добавьте обработчик к событию экземпляра UserControl1.

Adnan Maruf

@OriginalGriff сэр извините, что снова спрашиваю ваше время. Я смутно понимаю ваше это заявление "В конструкторе добавьте обработчик к событию экземпляра UserControl1" здесь. Вы хотите добавить этот код-->>

/// <summary>
/// Event to indicate VisibiltyChanged
/// </summary>
public event EventHandler VisibilityChanged;
/// <summary>
/// Called to signal to subscribers that VisibiltyChanged
/// </summary>
/// <param name="e"></param>
protected virtual void OnVisibilityChanged(EventArgs e)
    {
    EventHandler eh = VisibilityChanged;
    if (eh != null)
        {
        eh(this, e);
        }
    }


к Файл usercontrol1.Дизайнер.в CS ??

если это так, то я уже пробовал это, и это дает мне кучу ошибок...!

а если нет, то не могли бы вы мне точно показать, что куда класть? и что же делать?! Пожалуйста, считайте меня здесь новичком, потому что мои знания о кодировании и C# очень тонкие. Надеюсь, вы поймете, что я пытаюсь сказать. Спасибо снова :)

OriginalGriff

Нет, это код, который создает и вызывает событие - он входит в ваш файл UserControl1.cs как часть вашего класса вместе со свойством, которое я вам показал. Не изменяйте файл конструктора, пока не будете точно знать, что вы делаете - вы можете испортить весь свой элемент управления, так что он больше не будет отображаться.

Вы добавили свой пользовательский элемент управления в форму, перетащив его из панели инструментов, да? То есть "конструктор" - выделите там элемент управления и используйте панель свойств для изучения событий.

(Если вы этого не понимаете, найдите базовый учебник Visual Studio и посмотрите его - он объяснит эти вещи, и их очень много. Посмотрите также один из них на отладчике VS - вам нужно будет ознакомиться с ним, это самый большой инструмент, который вы когда-либо встретите!)

Adnan Maruf

Сэр, еще раз спасибо, вчера вечером было уже поздно [почти 3 часа ночи], так что я останавливаюсь там и начинаю сегодня снова. Я понимаю конструктор и его инструментарий,что каждый элемент на нем имеет свое собственное свойство, и эти значения могут быть изменены визуально из панели свойств,а также события, к которым можно получить доступ одним щелчком мыши, и он имеет множество обработчиков событий, таких как loads, mouse up, visualChanged и т. д., и может быть добавлен в код двойным щелчком мыши. Поэтому я добавляю обработчик событий form1 VisualChanged, а затем добавляю этот код-->

 private void Form1_VisibleChanged(object sender, EventArgs e)
        {
            UserControl1 uc = sender as UserControl1;
            if (uc != null)
            {
                button2.Enabled = uc.IsVisible;
            }

        }


но, к сожалению, это не сработало. Поэтому я подумал, что это может быть из-за того, что UserControl1 добавляется на панель form1, когда я нажимаю form1_button1. так что это должна быть та панель обработчика событий VisualChanged, поэтому я добавляю ее и ставлю тот же код..>

private void mainPanel_VisibleChanged(object sender, EventArgs e)//mainPanel==form1_panel1
        {
            UserControl1 uc = sender as UserControl1;
            if (uc != null)
            {
                button2.Enabled = uc.IsVisible;
            }
            
        }



опять же, он все равно не будет работать, form1_button2 не включается, как это должно быть, независимо от того, сколько раз я изменяю видимое свойство UserControl1_panel2. Я имею в виду, что я медленно учусь, я знаю, но это должно сработать в какой-то момент, верно? Сейчас уже 4-й день, и я все еще застрял с той же проблемой.

OriginalGriff

Ты заставляешь меня хотеть биться головой о стол... :смех:
Перестаньте гадать и подумайте об этом.

Мероприятие является частью пользовательского элемента управления - это, где вы положили линии

публичное мероприятие EventHandler VisibilityChanged;

и это ассоциированный метод, да?
Поэтому откройте Form1 в конструкторе, выделите элемент управления UserControl на панели form1 (проверьте его имя на панели свойств) и посмотрите на его события на панели свойств. VisibilityChanged должен быть указан в событиях.
Есть ли у него метод обработчика, указанный в его непосредственном праве, и если да, то как он называется?

Adnan Maruf

@OriginalGriff спасибо вам, сэр, за ваше доброе и удивительное время :)! Я действительно бил себя по голове сто раз за весь день :D! чтобы понять это, мне нужно установить настройку AutoToolBoxPopulate моего VS2008 на ture, чтобы иметь UserControl на панели инструментов. На этот раз я точно не реализовал ваш метод, но я нашел что-то очень похожее и угадайте, что он работает сейчас :D !! и это потому, что ваше слово побуждает меня искать о моих недостатках и улучшать его. Теперь я точно знаю, что мне нужно сделать, чтобы справиться с подобной ситуацией. Я очень ценю вашу помощь, сэр, вы просто великолепны!! #keepCalm&deepSearch...
кстати, я из маленькой страны под названием Бангладеш[если вам интересно :)]

OriginalGriff

Больше, чем Уэльс: 163 миллиона населения, 3 миллиона здесь, 57 000 квадратных миль, против 3000 здесь.

Ты тоже намного теплее нас ... :смеяться:

Adnan Maruf

И я действительно смотрел отладчик Vs, и теперь это немного сбивает с толку...!