用户控件以及如何从表单中获取按钮事件

时间:2011-09-15 05:51:19

标签: c# compact-framework

我创建了如下所示的用户控件:

enter image description here

后面的代码如下:

using System;
using System.Windows.Forms;

namespace Controlls
{
    public partial class Toolbar : UserControl
    {
        public Toolbar()
        {
            InitializeComponent();
        }

        private void pbNaprej_Click(object sender, EventArgs e)
        {

        }

        private void pbNazaj_Click(object sender, EventArgs e)
        {

        }

        private void pbNovo_Click(object sender, EventArgs e)
        {

        }

        private void bpbBrisi_Click(object sender, EventArgs e)
        {

        }

        private void pbPotrdi_Click(object sender, EventArgs e)
        {

        }

        private void txtOd_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

现在我移动这个UC形成但是有一个问题。如何从UC获得此活动。我需要为我使用此用户控件的表单中的按钮实现单击事件。我能看到的是,我可以像使用一个组件一样使用它,但我无法从中获得单独的按钮。

2 个答案:

答案 0 :(得分:1)

您需要在MainForm类中创建事件并以手动模式生成它。

如果您还在画布上或smth上绘制图标,则需要处理onClick MainForm,而不是计算鼠标点击位置,并生成您创建的事件。

如果具有自己的onClick事件的按钮或smth的数量,您可以在此按钮事件上挂起将在主窗体中生成偶数的操作。

回答您使用的方法,并通过一些代码。

<强>增加:

public partial class Toolbar : UserControl
{
    public Toolbar()
    {
        InitializeComponent();
    }

    public enum ToolBarCommands
    {
        Naprej, Nazaj, Novo
    }

    public Action<object, ToolBarCommands> MenuItemClick;

    private void pbNaprej_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
            MenuItemClick(this, ToolBarCommands.Naprej);             
    }

    private void pbNazaj_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
            MenuItemClick(this, ToolBarCommands.Nazaj);             
    }

    private void pbNovo_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
            MenuItemClick(this, ToolBarCommands.Novo);  
    }
}

如何使用它?易:

// Define section
var toolbar = new Toolbar();
toolbar.MenuItemClick += MenuItemClickHandler;

...

MenuItemClickHandler(object sender, Toolbar.ToolBarCommands item)
{
    switch(item)
    {
        case Toolbar.ToolBarCommands.Naprej:
            // Naperej handler
        break;

        case Toolbar.ToolBarCommands.Nazaj:
            // Nazaj handler
        break;

        case Toolbar.ToolBarCommands.Novo:
            // Novo handler
        break;
    }
}

<强>增加:

如果您的按钮名称与枚举成员相同,则可以删除此部分代码:

    private void pbNaprej_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
            MenuItemClick(this, ToolBarCommands.Naprej);             
    }

    private void pbNazaj_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
            MenuItemClick(this, ToolBarCommands.Nazaj);             
    }

    private void pbNovo_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
            MenuItemClick(this, ToolBarCommands.Novo);  
    }

它看起来就像一个方法(将此方法挂起到所有菜单元素事件)

    private void pbItem_Click(object sender, EventArgs e)
    {
        if(MenuItemClick != null)
        {
            ToolBarCommands command;
            var res = ToolBarCommands.TryParse(((Button)sender).Name, command)
            if(res == true)                
                MenuItemClick(this, command);
        }             
    }

答案 1 :(得分:1)

为您的控件添加2个事件处理程序,并在您使用它的位置订阅工具箱事件:

using System; 
using System.Windows.Forms; 

namespace Controlls 
{ 
    public enum ToolboxButtonType { Potrdi, Brisi, Novo, Nazaj, Naprej } 
    public partial class Toolbar : UserControl 
    { 
        public Toolbar() 
        { 
            InitializeComponent(); 
        } 

        private void pbNaprej_Click(object sender, EventArgs e) 
        { 
            OnToolboxClick(ToolboxButtonType.Naprej);
        } 

        private void pbNazaj_Click(object sender, EventArgs e) 
        { 
            OnToolboxClick(ToolboxButtonType.Nazaj);
        } 

        private void pbNovo_Click(object sender, EventArgs e) 
        { 
            OnToolboxClick(ToolboxButtonType.Novo);
        } 

        private void bpbBrisi_Click(object sender, EventArgs e) 
        { 
            OnToolboxClick(ToolboxButtonType.Brisi);
        } 

        private void pbPotrdi_Click(object sender, EventArgs e) 
        { 
             OnToolboxClick(ToolboxButtonType.Potrdi);
        } 

        private void txtOd_TextChanged(object sender, EventArgs e) 
        { 
             OnTextChanged(txtOd.Text);
        } 
    }
    private OnToolboxClick(ToolboxButtonType button)
    {
        if (ToolboxClick != null)
        {
            ToolboxClick(this, new ToolboxClickEventArgs(button));
        }
    }
    private OnTextChanged(string text)
    {
        if (ToolboxTextChanged!= null)
        {
            ToolboxTextChanged(this, new ToolboxTextChangedEventArgs(text));
        }
    }
    public class ToolboxTextChangedEventArgs: EventArgs
    {
        public string Text { get; private set; }
        public ToolboxClickEventArgs(string text) { Text = text; }
    }
    public class ToolboxClickEventArgs : EventArgs
    {
        public ToolboxButtonType Button { get; private set; }
        public ToolboxClickEventArgs(ToolboxButtonType button) { Button = button; }
    }
    public event EventHandler<ToolboxClickEventArgs> ToolboxClick;
    public event EventHandler<ToolboxTextChangedEventArgs> ToolboxTextChanged;
} 

例如:

//Toolbar toolbar = new Toolbar();
toolbar.ToolboxTextChanged += (s, e) => { btn1.Text = e.Text; };
toolbar.ToolboxClick += (s, e) => 
{
    swith(e.Button)
    {
        case ToolboxButtonType.Brisi: //
            break;
        default:
            break;
    }
};