我有一个 TableLayoutPanel 和一个 Treeview,我想彼此同步鼠标点击。这样做的原因是我希望能够在我的 TableLayoutPanel 中选择一些东西,然后它也应该在 Treeview 中选择一些东西。
这是它的外观:
我的第一次尝试有效,但有一些延迟。我将 Treeview 连接到 NodeMouseClick 事件,当该事件触发时,我Refresh() TableLayoutPanel 以便调用 CellPaint 事件并绘制整行。使用这种方法,我看到一些延迟,因为先绘制 Treeview,然后绘制 TableLayoutPanel。
当我使用相同的方法但反过来(单击 TableLayoutPanel 并在 Treeview 中选择相应的节点)时,我没有得到尽可能多的延迟。我猜这是因为绘制行所需的时间比选择节点所需的时间长。
我尝试了不同的解决方案:
class TableControl : TableLayoutPanel
{
TreeViewWithPaint m_TreeviewChild;
public void AddChildControl(TreeViewWithPaint treeview)
{
m_TreeviewChild = treeview;
}
protected override void WndProc(ref Message message)
{
const int WM_LBUTTONDOWN = 0x201;
switch (message.Msg)
{
case WM_LBUTTONDOWN:
//invalidate our table control so the OnPaint Method gets fired
this.Update();
//now copy the message and send it to the treeview
Message copy = new Message
{
HWnd = m_TreeviewChild.Handle,
LParam = message.LParam,
Msg = message.Msg,
Result = message.Result,
WParam = message.WParam
};
//pass the message onto the linked tree view
m_TreeviewChild.RecieveWndProc(ref copy);
break;
}
base.WndProc(ref message);
}
在我的 Treeview 类中,我添加了这个:
public void RecieveWndProc(ref Message m)
{
base.WndProc(ref m);
}
我想到了一个如何同步 Treeview 滚动条的例子
问题在于 TableLayoutPanel 中的 CellPaint 事件不再被触发,即使使用Update() ......它确实在 Treeview 中选择了正确的节点:
如果我尝试在 Treeview 中实现相同的东西(覆盖 WndProc),我也预见到会出现一些问题,这会导致复制消息的疯狂循环吗?
那么有没有(n)(简单)方法可以做到这一点?
谢谢</p>