baiwushi 发表于 2016-2-16 09:56:00

关于MultiRow只读状态下不落焦点的问题

MultiRow里面用的都是lablecell,我在前面主画面和模板上的ReadOnly和selectable都设了。
现在效果是这样的
首先,焦点在MultiRow之外的任何一个控件上,然后鼠标点击MultiRow,原来控件上的焦点不见了
       照理说,MultiRow是只读的,应该不会出现这样的效果的,焦点应该是落不上去的。

求问这个问题该怎么解决

Alice 发表于 2016-2-16 12:25:00

回复 1楼baiwushi的帖子

谢谢您的反馈。
我描述下您的问题,您看我的理解对不对。
您的操作是:
1.MultiRow是只读的,运行起来。
2.点击其他可以落入焦点的控件。
焦点落入。
3.然后点击MultiRow

对此步骤我不太理解的地方,因为Mulitow是只读的,你最初焦点是在哪个控件上,点击其他控件后焦点落入,按照我的理解这种情况是正常的,而且MultiRow是只读的,所以再次点击不能得到焦点。

baiwushi 发表于 2016-2-16 13:40:00

回复 2楼Alice的帖子

对,Mulitow是只读的,应该是不能得到焦点的,但是点击之后,原先焦点所在的控件上的焦点就丢失了。
但是如果我点击的是Mulitow两侧的滚动条,那么原先焦点所在的控件上的焦点就还在原来的控件上

Alice 发表于 2016-2-16 13:41:00

回复 3楼baiwushi的帖子

请问原先的焦点是如何设置的?

baiwushi 发表于 2016-2-16 13:45:00

回复 4楼Alice的帖子

不用设啊,别的控件,鼠标点击上去就可以了啊,然后在点击Mulitow

robert 发表于 2016-2-16 14:34:00

是否可以尝试以下代码,看是否可以解决问题

this.gcMultiRow1.ViewMode = ViewMode.Display;

baiwushi 发表于 2016-2-16 14:49:00

回复 6楼robert的帖子

好的,我试一下,谢谢了

baiwushi 发表于 2016-2-16 14:56:00

回复 6楼robert的帖子

试了下 好像不行

baiwushi 发表于 2016-2-16 15:38:00

我试着用另外的方法去解决吧

robert 发表于 2016-2-16 17:03:00

看了下,有两种方案

1. 设置GcMultiRow的Enabled属性为False
代码如下,好处是比较简单就可以实现,但是缺点是Scrollbar不能滚动了

            this.gcMultiRow1.Enabled = false;
            this.gcMultiRow1.DefaultCellStyle.DisabledBackColor = Color.White;
            this.gcMultiRow1.DefaultCellStyle.DisabledForeColor = Color.Black;

2. 重写WM_NCHITTEST消息
代码如下,好处是Scrollbar不影响ScrollBar是否可以点,可以精细控制不抢焦点的位置,缺点是代码有点复杂,需要把GcMultiRow控件派生一次。
   
    class MyGcMultiRow : GcMultiRow
    {
      public MyGcMultiRow()
      {
      }
      public const int WM_NCHITTEST = 0x0084;

      protected override void WndProc(ref Message m)
      {

            if (m.Msg == WM_NCHITTEST)
            {
                Point point = new Point(LowWord(m.LParam.ToInt32()), HighWord(m.LParam.ToInt32()));
                point = PointToClient(point);
                if (this.HitTest(point).Type != HitTestType.HorizontalScrollBar &&
                  this.HitTest(point).Type != HitTestType.VerticalScrollBar)
                {
                  return;
                }
            }
            base.WndProc(ref m);
      }

      public static ushort LowWord(int value)
      {
            return (ushort)(value & 0xffff);
      }
      public static ushort HighWord(int value)
      {
            return (ushort)((value & 0xffff0000) >> 16);
      }
    }

希望对你有所帮助
页: [1] 2
查看完整版本: 关于MultiRow只读状态下不落焦点的问题