2017-06-20 125 views
1

我有一个包含多个选项卡控件的选项卡控件。所有的选项卡控件都是使用winforms设计器创建的。嵌入式选项卡控件每个都有分配给它们的对象Chart。这些是程序运行后创建的,并且在每个排行榜中给出的三个事件:选项卡控件阻止鼠标滚动事件C#

chart.MouseWheel += new MouseEventHandler((sender, e) => this.Chart_MouseWheel(sender, e, chart, raw, condensed, bounds)); 
chart.MouseHover += new EventHandler(Chart_Hover); 
chart.MouseClick += new MouseEventHandler((sender, e) => this.Chart_Click(sender, e, chart)); 

为了方便调试,我添加了一个简单Console.WriteLine();每个方法,看看实际上被解雇哪些方法。

private void Chart_MouseWheel(object sender, MouseEventArgs e, Chart chart, DataTable raw, DataCondenser condensed, List<double> bounds) 
{ 
    Console.WriteLine("a"); 
} 

private void Chart_Hover(object sender, EventArgs e) 
{ 
    Console.WriteLine("b"); 
} 

private void Chart_Click(object sender, MouseEventArgs e, Chart chart) 
{ 
    Console.WriteLine("c"); 
} 

徘徊,点击和滚动了很多,我只能得到bc将被输出。出于某种原因,滚动事件不会被拾取。我有一种感觉,这与一个选项卡控件内部有关。

任何想法为什么会发生这种情况?

编辑:

试过这种小规模的版本,同样的事情正在发生。

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Chart test = new Chart(); 
     test.Width = 500; 
     test.Height = 500; 


     test.MouseWheel += new MouseEventHandler(Chart_Scroll); 
     test.MouseHover += new EventHandler(Chart_Hover); //mousehover event for the tooltip to activate 
     test.MouseClick += new MouseEventHandler(Chart_Click); 

     tabPage3.Controls.Add(test); 
    } 

    private void Chart_Scroll(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine("a"); 
    } 

    private void Chart_Hover(object sender, EventArgs e) 
    { 
     Console.WriteLine("b"); 
    } 

    private void Chart_Click(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine("c"); 
    } 

发生了同样的问题。 tabPage3是选项卡控件内tab控件的tabpage。

编辑2:

所以如果我给图表此事件处理程序:

test.MouseEnter += new EventHandler(mouseEnter); 

与方法:

private void mouseEnter(object sender, EventArgs e) 
{ 
    this.Focus(); 
} 

它仍然无法正常工作。但是,如果我使用这个:

private void mouseEnter(object sender, EventArgs e) 
{ 
    if (sender is Chart) 
    { 
     Chart temp = (Chart) sender; 
     temp.Focus(); 
    } 
} 

即使它嵌入到其他控件中,它也可以工作。

+0

可以的,如果你加它,你得到一个'滚动()'从图表事件* *直接**到表格(不存在其他控件)? –

+0

@Idle_Mind有趣。所以如果它只是表格上的图表,我仍然无法滚动。我添加了一个'MouseEnter'事件处理程序来执行'test.Focus()',然后开始拾取滚动事件。 – Tim

+0

完美。你可以扩展Chart类并添加MouseEnter/Focus组合吗?如果没有,我们可以探索其他方式为您的应用中的所有图表制作“自动”。 –

回答

0

你可以连线了的MouseEnter()事件,并用一行代码这样给图表焦点:

test.MouseEnter += (s, evt) => { ((Control)s).Focus(); };