自定义控件上的单击事件未触发(从包含表单分配的事件)
Click event on Custom Control isn't firing (event assigned from containing form)
我有以下控件,上面只有一个 TreeView 和 ToolStrip:
public partial class MyTreeView : UserControl
{
private string _nodeName;
public string NodeName { get { return _nodeName;} }
public MyTreeView()
{
InitializeComponent();
}
private void trv_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node == null || e.Node.Parent == null || e.Node.Parent.Parent == null)
return;
nodeName = e.Node.Parent.Parent.Text + @"\" + e.Node.Parent.Text + @"\" + e.Node.Text;
}
}
然后在包含 MyTreeView
实例的主窗体中,我尝试在其中添加一个 Click 事件:
private void mtv_Click(object sender, EventArgs e)
{
MessageBox.Show(mtv.NodeName.ToString());
}
AfterSelect
事件触发并且 nodeName
包含预期值,但 Click
未触发。
最终,当 TreeView 选择发生变化时,我将加载一个文件并在文本框中显示其内容,但我不知道如何 'notify' 在自定义控件。
你可以试试这个。
像这样重写你的控件。
public partial class MyTreeView : UserControl
{
//create a custom event
[Browsable(true)]
public event TreeViewEventHandler AfterSelect;
public MyTreeView()
{
InitializeComponent();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (AfterSelect != null) {
//raise the event , as it is subscribed may be in winform
AfterSelect.Invoke(sender, e);
}
}
}
现在以 win 形式在 Select MytreeView 控件事件后订阅。
public Form2()
{
InitializeComponent();
//subscribe myTreeView1.AfterSelect event
myTreeView1.AfterSelect += new TreeViewEventHandler(myTreeView1_AfterSelect);
}
private void myTreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//cast sender into TreeView
TreeView tree = sender as TreeView;
if (tree != null) {
//do your logic here
}
}
试试这个
public partial class MyTreeView : UserControl
{
public delegate void ValueSelectedHandler(object sender, EventArgs e, string value);
public event ValueSelectedHandler OnValueSelected;
private string _nodeName;
public string NodeName { get { return _nodeName;} }
public MyTreeView()
{
InitializeComponent();
}
private void trv_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node == null || e.Node.Parent == null || e.Node.Parent.Parent == null)
return;
nodeName = e.Node.Parent.Parent.Text + @"\" + e.Node.Parent.Text + @"\" + e.Node.Text;
if(OnValueSelected!=null)
{
OnValueSelected(sender, e, nodeName);
}
}
}
现在在你的表单中
public Form1()
{
InitializeComponent();
myTreeView1.OnValueSelected += ValueSelected;
}
private void ValueSelected(object sender, EventArgs e, string value)
{
MessageBox.Show(value);
}
我有以下控件,上面只有一个 TreeView 和 ToolStrip:
public partial class MyTreeView : UserControl
{
private string _nodeName;
public string NodeName { get { return _nodeName;} }
public MyTreeView()
{
InitializeComponent();
}
private void trv_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node == null || e.Node.Parent == null || e.Node.Parent.Parent == null)
return;
nodeName = e.Node.Parent.Parent.Text + @"\" + e.Node.Parent.Text + @"\" + e.Node.Text;
}
}
然后在包含 MyTreeView
实例的主窗体中,我尝试在其中添加一个 Click 事件:
private void mtv_Click(object sender, EventArgs e)
{
MessageBox.Show(mtv.NodeName.ToString());
}
AfterSelect
事件触发并且 nodeName
包含预期值,但 Click
未触发。
最终,当 TreeView 选择发生变化时,我将加载一个文件并在文本框中显示其内容,但我不知道如何 'notify' 在自定义控件。
你可以试试这个。 像这样重写你的控件。
public partial class MyTreeView : UserControl
{
//create a custom event
[Browsable(true)]
public event TreeViewEventHandler AfterSelect;
public MyTreeView()
{
InitializeComponent();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (AfterSelect != null) {
//raise the event , as it is subscribed may be in winform
AfterSelect.Invoke(sender, e);
}
}
}
现在以 win 形式在 Select MytreeView 控件事件后订阅。
public Form2()
{
InitializeComponent();
//subscribe myTreeView1.AfterSelect event
myTreeView1.AfterSelect += new TreeViewEventHandler(myTreeView1_AfterSelect);
}
private void myTreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//cast sender into TreeView
TreeView tree = sender as TreeView;
if (tree != null) {
//do your logic here
}
}
试试这个
public partial class MyTreeView : UserControl
{
public delegate void ValueSelectedHandler(object sender, EventArgs e, string value);
public event ValueSelectedHandler OnValueSelected;
private string _nodeName;
public string NodeName { get { return _nodeName;} }
public MyTreeView()
{
InitializeComponent();
}
private void trv_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node == null || e.Node.Parent == null || e.Node.Parent.Parent == null)
return;
nodeName = e.Node.Parent.Parent.Text + @"\" + e.Node.Parent.Text + @"\" + e.Node.Text;
if(OnValueSelected!=null)
{
OnValueSelected(sender, e, nodeName);
}
}
}
现在在你的表单中
public Form1()
{
InitializeComponent();
myTreeView1.OnValueSelected += ValueSelected;
}
private void ValueSelected(object sender, EventArgs e, string value)
{
MessageBox.Show(value);
}