7

背景:私は c# で winforms を使用しています。画像を datagridview セルに表示したくありません。データベースにパスのみを保存し、データベースから datagridview に表示しています。

問題:ユーザーがセルに入力すると、ツールチップがポップアップ表示されます。私が必要とするのは、現在のセルの列インデックスが 2 の場合、現在のセルで指定されたパスの画像をツール ヒントに表示することです。

この記事はとても良いと思います。しかし、成功することはできません。次のコードがあります

    void CustomizedToolTip_Popup(object sender, PopupEventArgs e)
    {
        DataGridView parent = e.AssociatedControl as DataGridView;
        if (parent.CurrentCell != null)
        {
            if (parent.CurrentCell.ColumnIndex == 2)
            {
                Bitmap bmpIn = new Bitmap(parent.CurrentCell.Value + "");
                using (Graphics g = Graphics.FromImage(bmpIn))
                {
                    Rectangle mr = new Rectangle(5, 5, 50, 50);
                    mr.Location = new Point(5, 5);
                    g.PageUnit = GraphicsUnit.Pixel;
                    g.DrawImage(bmpIn, mr);
                }
            }
        }
    }

このコードは画像を描画するはずだと思っていましたが、描画ではなく、描画するよりも場所がわかりません。私が言及した記事からはそれを理解できませんでした。以下は私のデータグリッドビューの画像です。

ここに画像の説明を入力

4

3 に答える 3

5

私はプロジェクトのために似たようなことをしました。

代わりに、開いてCellMouseOver閉じるように設定したフォームを使用しましたCellMouseLeave

    frm_MouseOverPicture HoverZoom = new frm_MouseOverPicture();

    private void dgv_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
    {
       DataGridView dgv_sender = sender as DataGridView;
       DataGridViewCell dgv_MouseOverCell = dgv_sender.Rows[e.RowIndex].Cells[e.ColumnIndex];

       //Get FilePath from dgv_MouseOverCell content

       //Get x, y based on position relative to edge of screen
       //x, y = top left point of HoverZoom form

       HoverZoom.LoadPicture(FilePath);
       HoverZoom.Location = new System.Drawing.Point(x, y);
       HoverZoom.Show();

    }

    private void dgv_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
    {
       HoverZoom.Hide();
       HoverZoom.ClearPicture();
    }

それがあなたが探しているものに十分近いことを願っています. 枠のないフォームを作り、全体にピクチャーボックスを配置しました。

于 2013-02-12T21:05:13.793 に答える
2

フォームにピクチャボックスを追加し、サイズモードを「StretchImage」およびvisible = falseに設定してから、次のイベントをデータグリッドビューに追加します

       private void metroGrid1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
    {
        DataGridView dgv_sender = sender as DataGridView;
        DataGridViewCell dgv_MouseOverCell=null;
        if (e.RowIndex > 0 && e.ColumnIndex > 0 && e.RowIndex <dgv_sender.RowCount && e.ColumnIndex<dgv_sender.ColumnCount)
        {
          dgv_MouseOverCell = dgv_sender.Rows[e.RowIndex].Cells[e.ColumnIndex];
        }
        if(dgv_MouseOverCell !=null)
        if (e.ColumnIndex == 4) {
            if (dgv_MouseOverCell.Value != null)
            {
                if (File.Exists(dgv_MouseOverCell.Value.ToString()))
                {
                    Image img = Image.FromFile(dgv_MouseOverCell.Value.ToString());
                    pictureBox1.ImageLocation = dgv_MouseOverCell.Value.ToString();
                    pictureBox1.Location = new System.Drawing.Point(Cursor.Position.X - this.Location.X, Cursor.Position.Y - this.Location.Y);
                    pictureBox1.Visible = true;
                }
            }
        }
    }

    private void metroGrid1_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
    {
        pictureBox1.Visible = false;
    }

ここをクリックして画像を表示

于 2018-01-21T13:25:17.483 に答える
1
    void CustomizedToolTip_Popup(object sender, PopupEventArgs e)
    {
        DataGridView parent = e.AssociatedControl as DataGridView;
        if (parent.CurrentCell != null)
        {
            if (parent.CurrentCell.ColumnIndex == 2)
            {
                string path = parent.CurrentCell.Value.ToString();
                using (System.Drawing.Imaging.Metafile emf = new System.Drawing.Imaging.Metafile(path))
                using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(emf.Width, emf.Height))
                {
                    bmp.SetResolution(emf.HorizontalResolution, emf.VerticalResolution);

                    using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp))
                    {
                        g.DrawImage(emf,
                            new Rectangle(0, 0, emf.Width, emf.Height),
                            new Rectangle(0, 0, emf.Width, emf.Height),
                            GraphicsUnit.Pixel
                        );

                        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                    }
                }
            }
        }
    }

ソース

を使用するにはSystem.Windows.Interop

「アセンブリを取得するには、 .NET 3.0 ランタイム以降をダウンロードしてインストールする必要があります...」

「.NET 3.0 をインストールすると、[参照の追加] リストにコンポーネント名が "WindowsBase" として表示されます。表示されない場合は、[参照の追加] ダイアログの [参照] タブからいつでも追加できます。 (C:\Program Files \Reference Assemblies\Microsoft\Framework\v3.0 ボックスに)"

ソース

于 2013-02-12T22:27:12.000 に答える