Рейтинг:
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, и теперь это немного сбивает с толку...!