找回密码
 立即注册

QQ登录

只需一步,快速开始

yangsq

银牌会员

7

主题

25

帖子

2276

积分

银牌会员

积分
2276

活字格认证

yangsq
银牌会员   /  发表于:2015-1-14 09:24  /   查看:11708  /  回复:11
现在在表头上加了很多按钮,之前问过说表头的按钮不能触发事件,只能通过CellClick捕捉,虽然想要的功能实现了,但是没有点击效果,请问能有办法实现点击效果吗?什么方法都可以,只要有压下那种感觉就行。类似于换一下颜色再换回来那种的(这个我试了,好像在事件结束前颜色都不会被反映到画面上)。

11 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2015-1-14 10:28:00
沙发
回复 1楼yangsq的帖子

请通过以下代码实现:

  1. ButtonCellType bctype = new ButtonCellType();

  2.         private void Form1_Load(object sender, EventArgs e)
  3.         {
  4.             bctype.ButtonColor2 = Color.Red;
  5.             bctype.ButtonColor = Color.Yellow;

  6.             this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bctype;

  7.             bctype.Picture= Image.FromFile(@"E:\tx19 - 副本.png");
  8.         }

  9.         private void fpSpread1_MouseDown(object sender, MouseEventArgs e)
  10.         {
  11.             if (e.Button== System.Windows.Forms.MouseButtons.Left)
  12.             {
  13.                 FarPoint.Win.Spread.HitTestInformation ht = this.fpSpread1.HitTest(e.X, e.Y);
  14.                 if (ht.Type== FarPoint.Win.Spread.HitTestType.ColumnHeader)
  15.                 {
  16.                     bctype.Picture = Image.FromFile(@"E:\无标题.png");
  17.                     this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bctype;         
  18.                 }
  19.             }
  20.         }

  21.         private void fpSpread1_MouseUp(object sender, MouseEventArgs e)
  22.         {
  23.             if (e.Button == System.Windows.Forms.MouseButtons.Left)
  24.             {
  25.                 FarPoint.Win.Spread.HitTestInformation ht = this.fpSpread1.HitTest(e.X, e.Y);
  26.                 if (ht.Type == FarPoint.Win.Spread.HitTestType.ColumnHeader)
  27.                 {
  28.                     bctype.Picture = Image.FromFile(@"E:\tx19 - 副本.png");
  29.                     this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bctype;
  30.                 }
  31.             }
  32.         }
复制代码


为了给你提供更优质的服务,请对本次服务进行评分。我们会认真对待你提出的宝贵意见,谢谢
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-1-14 12:25:00
板凳
回复 2楼iceman的帖子

谢谢回答,通过捕捉鼠标点击事件确实是一个很好的思路,但是能不能不通过图片设置呢?客户这边追加图片文件什么的很麻烦。
还有不知道是我的版本问题还是什么原因(版本FarPoint.Win.SpreadJ7.0.2016.2008),当我点击时按钮会发生变化,但是在按钮范围内松开时,不会变回去,只有鼠标离开按钮范围才会变回去。
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-1-14 12:41:00
地板
回复 3楼yangsq的帖子

Imports FarPoint.Win

Public Class Form2
    Dim bttncell As New FarPoint.Win.Spread.CellType.ButtonCellType()

    Dim flg As Boolean = False

    Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        bttncell.Text = "Click"
        bttncell.TextColor = Color.Black
        bttncell.WordWrap = True

        Me.FpSpread1.ActiveSheet.ColumnHeader.Columns(0).CellType = bttncell
    End Sub


    Private Sub FpSpread1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseDown
        If (e.Button = System.Windows.Forms.MouseButtons.Left) Then


            Dim ht As FarPoint.Win.Spread.HitTestInformation = Me.FpSpread1.HitTest(e.X, e.Y)


            If (ht.Type = FarPoint.Win.Spread.HitTestType.ColumnHeader) And flg = False Then

                bttncell.TextColor = Color.Gray

                Me.FpSpread1.ActiveSheet.ColumnHeader.Columns(0).CellType = bttncell
                flg = True

            End If
        End If

    End Sub

    Private Sub FpSpread1_MouseUp(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseUp
        If (e.Button = System.Windows.Forms.MouseButtons.Left) Then

            Dim ht As FarPoint.Win.Spread.HitTestInformation = Me.FpSpread1.HitTest(e.X, e.Y)

            If flg = True Then
                bttncell.TextColor = Color.Black
                Me.FpSpread1.ActiveSheet.ColumnHeader.Columns(0).CellType = bttncell
                flg = False
            End If
        End If
    End Sub
End Class

我这样做大概能实现想要的效果,但是还是有我上面说的问题,另外就是在按钮上压下之后,去其他地方松开,按钮不会恢复,原因好像是按钮的效果没反映上去,切换下画面什么的再回来颜色就会恢复,这种问题有解决方案吗?
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-1-14 12:56:00
5#
Dim ht As FarPoint.Win.Spread.HitTestInformation = Me.FpSpread1.HitTest(e.X, e.Y)
If (ht.Type = FarPoint.Win.Spread.HitTestType.ColumnHeader) And flg = False Then
End If
鼠标点下时取不到表头具体的位置吗?只判断是不是表头没有意义啊
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-1-14 18:05:00
6#
回复 5楼yangsq的帖子

实现方法比较粗暴,看能否解决你的问题:

  1. ButtonCellType bctype = new ButtonCellType();
  2.         bool flag = true;
  3.         private void Form1_Load(object sender, EventArgs e)
  4.         {
  5.             bctype.ButtonColor2 = Color.Red;
  6.             bctype.ButtonColor = Color.Yellow;

  7.             this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bctype;

  8.             bctype.Picture= Image.FromFile(@"E:\tx19 - 副本.png");
  9.         }

  10.         private void fpSpread1_MouseDown(object sender, MouseEventArgs e)
  11.         {
  12.             if (e.Button== System.Windows.Forms.MouseButtons.Left)
  13.             {
  14.                 FarPoint.Win.Spread.HitTestInformation ht = this.fpSpread1.HitTest(e.X, e.Y);
  15.                 if (ht.HeaderInfo!=null)
  16.                 {
  17.                     if (ht.HeaderInfo.Column==0 && ht.HeaderInfo.Row==0)
  18.                     {
  19.                         bctype.Picture = Image.FromFile(@"E:\无标题.png");
  20.                         this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bctype;
  21.                         flag = false;
  22.                     }
  23.                 }
  24.             }
  25.         }

  26.         private void fpSpread1_MouseUp(object sender, MouseEventArgs e)
  27.         {
  28.             if (e.Button == System.Windows.Forms.MouseButtons.Left && flag==false)
  29.             {
  30.                 bctype.Picture = Image.FromFile(@"E:\tx19 - 副本.png");
  31.                 this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bctype;
  32.                 flag = true;
  33.             }
  34.         }
复制代码
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-1-15 09:34:00
7#
回复 6楼iceman的帖子

谢谢回答,位置判断没问题了
客户这边不让用图片实现点击效果,用我在4楼那种控制bttncell.TextColor 的方法的话,不知道能不能再现以下2个问题:
1,点击鼠标时按钮会发生变化,但是在按钮范围内松开鼠标时,不会变回去,只有鼠标离开按钮范围才会变回去。
2,在按钮上压下鼠标之后,去其他地方松开鼠标,按钮不会恢复(原因好像是按钮的效果没反映上去,切换下画面什么的再回来颜色就会恢复)
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-1-15 16:00:00
8#
回复 7楼yangsq的帖子

请问 6# 代码尝试了吗?以下代码替换为 textcolor 也没问题。
另外,还是建议你用冻结行来模拟列头。不知道你这边没有采纳的顾虑是什么?

  1. ButtonCellType bttncell = new ButtonCellType();
  2.         bool flag = true;
  3.         private void Form1_Load(object sender, EventArgs e)
  4.         {
  5.             bttncell.Text = "Click";
  6.             bttncell.TextColor = Color.Red;
  7.             bttncell.WordWrap = true;

  8.             this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bttncell;
  9.         }

  10.         private void fpSpread1_MouseDown(object sender, MouseEventArgs e)
  11.         {
  12.             if (e.Button== System.Windows.Forms.MouseButtons.Left)
  13.             {
  14.                 FarPoint.Win.Spread.HitTestInformation ht = this.fpSpread1.HitTest(e.X, e.Y);
  15.                 if (ht.HeaderInfo!=null)
  16.                 {
  17.                     if (ht.HeaderInfo.Column==0 && ht.HeaderInfo.Row==0)
  18.                     {
  19.                         bttncell.TextColor = Color.Gray;
  20.                         this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bttncell;
  21.                         flag = false;
  22.                     }
  23.                 }
  24.             }
  25.         }

  26.         private void fpSpread1_MouseUp(object sender, MouseEventArgs e)
  27.         {
  28.             if (e.Button == System.Windows.Forms.MouseButtons.Left && flag==false)
  29.             {
  30.                 bttncell.TextColor = Color.Red;
  31.                 this.fpSpread1.ActiveSheet.ColumnHeader.Columns[0].CellType = bttncell;
  32.                 flag = true;
  33.             }
  34.         }
复制代码
回复 使用道具 举报
yangsq
银牌会员   /  发表于:2015-1-16 08:25:00
9#
回复 8楼iceman的帖子

代码试过了,还是有我说的那两个问题。
没有用模拟列头,是因为这次不是直接创建新的画面,是用Spread来替换Datagridview,用模拟列头的话考虑改修范围和量比较大,容易出bug,而且不是所有的画面都是有按钮的,考虑到画面样式统一性,最终确定不用模拟列头。
现在在CellClick事件中用了下面的代码来模拟点击效果,但这是没办法的办法了,如果上面那种方法的问题解决的话,还是希望能用上面的。
      Me.regulationFpSpread.Enabled = False
        System.Threading.Thread.Sleep(50)
        Me.regulationFpSpread.Enabled = True
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-1-16 10:34:00
10#
回复 9楼yangsq的帖子

这两个问题我没有重现附件是重现录像。
mouseclick_spread.zip (178.15 KB, 下载次数: 649)

评分

参与人数 1满意度 +5 收起 理由
yangsq + 5 非常感谢,帮了大忙了

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部