首页 新闻 搜索 专区 学院

窗口和用户控件里的事件怎么相互触发

0
悬赏园豆:50 [已解决问题] 解决于 2014-01-05 18:19

比如项目里有一个窗口和一个用户控件,

窗口和用户控件里都有一个Button,点击窗口里的Button怎么触发用户控件里Button的Click事件

不关你的事的主页 不关你的事 | 初学一级 | 园豆:109
提问于:2014-01-04 21:12
< >
分享
最佳答案
1

如果你说的是 WinForm:

假定窗体上用户控件的名称为 userControl11,可在窗体的 button1_Click 事件方法中如下触发:

using System.Linq;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            var button = userControl11.Controls
                .OfType<Button>()
                //.Where(b=>b.Name == "btnXXXX")  // 如果包含多个 Button,使用此行进行过滤。
                .First();
            button.PerformClick();
        }
        //...
}

 如果你使用的 .net 版本低无法使用 Linq,可使用以下代码:

private void button1_Click(object sender, EventArgs e)
{
    Button button = GetButtonFromUserControl();
    if(button != null) button.PerformClick();
}

private Button GetButtonFromUserControl()
{
    foreach (Control control in userControl11.Controls)
    {
        Button button = control as Button;
        if (button == null) continue;

        //if (button.Name == "btnXXXXX")  // 如果包含多个 Button,使用此行进行过滤。
            return button;
    }
    return null;
}
收获园豆:50
鹤冲天 | 老鸟四级 |园豆:2379 | 2014-01-04 22:02
//WPF应用程序


//窗口.CS
 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            contentControl1.Content = new UserControl1();
        }

        private void 窗口Button_Click(object sender, RoutedEventArgs e)
        {
           //怎么触发 用户控件Button_Click
        }
    }


//用户控件.CS
 public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        private void 用户控件Button_Click(object sender, RoutedEventArgs e)
        {
            用户控件Button.Content = "你好";
        }
    }
不关你的事 | 园豆:109 (初学一级) | 2014-01-04 22:49

可以这样:

private void 窗口Button_Click(object sender, RoutedEventArgs e)
{
    var v = contentControl1.Content as UserControl;
    var b = v.FindName("用户控件Button") as Button;
    b.RaiseEvent( new RoutedEventArgs(e.RoutedEvent));
}

但我建议使用另一种方式,将 用户控件Button_Click 方法中的代码重构为一个 public 方法:

public partial class UserControl1 : UserControl
{
    //...

    private void 用户控件Button_Click(object sender, RoutedEventArgs e)
    {
        DoSomethings();
    }

    public void DoSomethings()
    {
        用户控件Button.Content = "你好";
    }
}

窗口Button_Click 方法代码如下:

var v = contentControl1.Content as UserControl1;
v.DoSomethings();
鹤冲天 | 园豆:2379 (老鸟四级) | 2014-01-04 23:55

@鹤冲天: 要是反过来又怎么调用啊,点击用户控件Button改变窗口Button的Content

不关你的事 | 园豆:109 (初学一级) | 2014-01-05 00:18

@不关你的事: 如果窗体上有个名为 okButton 的 Button,可如下调用:

private void 用户控件Button_Click(object sender, RoutedEventArgs e)
{
    var w = Window.GetWindow(用户控件Button);   // 获取当前窗体
    var b = w.FindName("okButton") as Button;   //  找到当前窗体上的 okButton
    b.RaiseEvent(new RoutedEventArgs(e.RoutedEvent));  
}
鹤冲天 | 园豆:2379 (老鸟四级) | 2014-01-05 10:10

@鹤冲天: 问题以解决,谢谢大神的指点

不关你的事 | 园豆:109 (初学一级) | 2014-01-05 18:16

@鹤冲天: 请教一下C#

int[] a = { 1,2,3,4,5,6,7,8,9,0};

数组中任意8个数组合有多少种怎么算啊,

不能重复,如果要从小到大排列又怎么写

不关你的事 | 园豆:109 (初学一级) | 2014-01-18 12:13
其他回答(2)
0

在窗体的button事件中直接调用用户控件的Button的click事件处理方法 就OK

朝兮兮 | 园豆:69 (初学一级) | 2014-01-04 21:59
0

你说的在ASP.NET程序吗?

Albert Fei | 园豆:2102 (老鸟四级) | 2014-01-04 21:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册