2017-08-08 141 views
2

データグリッドを持つフォームがあります。私ができることをしたいのは、セルを右クリックしたときにマウスの横にドロップダウンメニューが表示されるようにすることです。私は、メニューからオプションを選択していくつかのものを実行できる必要があります。DataGridviewセルを右クリックしてコンテキストメニューを表示する方法

登録するには右クリックイベントが表示されますが、コンテキストメニューは表示されません。 以下のコードのメニューに、セルをコピーするオプションが表示されます。ここで

[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) 
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Drawing”) 
$form = New-Object System.Windows.Forms.Form 
$form.Size = New-Object System.Drawing.Size(1040,518) 
$form.KeyPreview = $true 
$form.StartPosition = 'centerscreen' 
$form.BackColor = 'MidnightBlue' 
$form.Add_KeyDown({if($_.KeyCode -eq "Escape"){$form.Close()}}) 
$form.Text = "VIOC Toolkit 5.4" 
$form.Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + "\powershell_ise.exe") 
$form.MinimumSize = New-Object System.Drawing.Size(1040,525) 

$DataGrid1 = New-Object System.Windows.Forms.DataGridView 
$DataGrid1.Location = New-Object System.Drawing.Size(298,29) 
$DataGrid1.Dock = "Fill" 
$DataGrid1.BorderStyle = 'FixedSingle'  
$DataGrid1.DefaultCellStyle.Font = New-Object System.Drawing.Font($dgfont,$dgfontSize) 
$DataGrid1.AlternatingRowsDefaultCellStyle.BackColor = 'LightGray' 
$DataGrid1.AllowUserToAddRows = $false 
$DataGrid1.RowHeadersVisible = $false 
$DataGrid1.BackgroundColor = "White" 
$DataGrid1.Name="DataGrid1" 
$DataGrid1.Text="DataGrid1" 
$DataGrid1.ColumnCount = 3 
$DataGrid1.Columns[0].Name = 'one' 
$DataGrid1.Columns[1].Name = 'two' 
$DataGrid1.Columns[2].Name = 'three' 
$DataGrid1.Rows.add(@('a', 'b', 'c')) 
$DataGrid1.Rows.add(@('d', 'e', 'f')) 
#*************************************************************#  
$DataGrid1.add_CellMouseClick({ 
    if($_.button -eq 'Right'){ 
     ContextMenu($DataGrid1) 
    } 
}) 

function ContextMenu($Grid){ 
    #create the context menu 
    $menu = New-Object System.Windows.Forms.ContextMenu 
    $CopyMenuItem = New-Object System.Windows.Forms.MenuItem 
    $copymenuItem.text = 'copy' 
    $copymenuItem.add_Click({write-host 'clicked copy'}) 
    $menu.MenuItems.AddRange(@($CopyMenuItem)) 

} 

#***************************************************************# 
$form.Controls.Add($DataGrid1) 
$form.ShowDialog() | out-null 
+0

をあなたの代わりに新しいコンテキストメニューを作成する 'DataGridViews'自身' ContextMenuStrip'を使用して考えがあります。 – JohnG

+0

長い目で見れば、私はメニューのコピーを持っていませんが、それは簡単な例です。メニューは私の好みに向いています。 – CuriousOne

+0

コンテキストメニューはコンテキストメニューです....それについて「カスタム」とは何ですか? – JohnG

答えて

1

このコード試してみてください。

[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) 
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Drawing”) 
$form = New-Object System.Windows.Forms.Form 
$form.Size = New-Object System.Drawing.Size(1040,518) 
$form.KeyPreview = $true 
$form.StartPosition = 'centerscreen' 
$form.BackColor = 'MidnightBlue' 
$form.Add_KeyDown({if($_.KeyCode -eq "Escape"){$form.Close()}}) 
$form.Text = "VIOC Toolkit 5.4" 
$form.Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + "\powershell_ise.exe") 
$form.MinimumSize = New-Object System.Drawing.Size(1040,525) 

[System.Windows.Forms.DataGridView] $DataGrid1 = New-Object System.Windows.Forms.DataGridView 
$DataGrid1.Location = New-Object System.Drawing.Size(298,29) 
$DataGrid1.Dock = "Fill" 
$DataGrid1.BorderStyle = 'FixedSingle'  
#$DataGrid1.DefaultCellStyle.Font = New-Object System.Drawing.Font $dgfont,$dgfontSize 
$DataGrid1.AlternatingRowsDefaultCellStyle.BackColor = 'LightGray' 
$DataGrid1.AllowUserToAddRows = $false 
$DataGrid1.RowHeadersVisible = $false 
$DataGrid1.BackgroundColor = "White" 
$DataGrid1.Name="DataGrid1" 
$DataGrid1.Text="DataGrid1" 
$DataGrid1.ColumnCount = 3 
$DataGrid1.Columns[0].Name = 'one' 
$DataGrid1.Columns[1].Name = 'two' 
$DataGrid1.Columns[2].Name = 'three' 
$DataGrid1.Rows.add(@('a', 'b', 'c')) 
$DataGrid1.Rows.add(@('d', 'e', 'f')) 

#Creation of content click event 
$ClickElementMenu= 
{ 
    [System.Windows.Forms.ToolStripItem]$sender = $args[0] 
    [System.EventArgs]$e= $args[1] 

    $Contentcell=$DataGrid1.Rows[$DataGrid1.CurrentCell.RowIndex].Cells[$DataGrid1.CurrentCell.ColumnIndex].Value 
    $ElementMenuClicked=$sender.Text 
    $RowIndex=$DataGrid1.CurrentCell.RowIndex 
    $ColIndex=$DataGrid1.CurrentCell.ColumnIndex 


    $result="Click on element menu : '{0}' , in rowindex : {1} , column : {2}, content cell : {3}" -f $ElementMenuClicked, $RowIndex, $ColIndex, $Contentcell; 
    Write-Host $result 
} 

#creation menu 
$contextMenuStrip1=New-Object System.Windows.Forms.ContextMenuStrip 

#creation element1 of menu 
[System.Windows.Forms.ToolStripItem]$toolStripItem1 = New-Object System.Windows.Forms.ToolStripMenuItem 
$toolStripItem1.Text = "Element 1"; 
$toolStripItem1.add_Click($ClickElementMenu) 
$contextMenuStrip1.Items.Add($toolStripItem1); 

#creation element2 of menu 
[System.Windows.Forms.ToolStripItem]$toolStripItem2 = New-Object System.Windows.Forms.ToolStripMenuItem 
$toolStripItem2.Text = "Element 2"; 
$toolStripItem2.add_Click($ClickElementMenu) 
$contextMenuStrip1.Items.Add($toolStripItem2); 

#creation event of mouse down on datagrid and show menu when click 
$DataGrid1.add_MouseDown({ 
    $sender = $args[0] 
    [System.Windows.Forms.MouseEventArgs]$e= $args[1] 

    if ($e.Button -eq [System.Windows.Forms.MouseButtons]::Right) 
    { 
     [System.Windows.Forms.DataGridView+HitTestInfo] $hit = $DataGrid1.HitTest($e.X, $e.Y); 
     if ($hit.Type -eq [System.Windows.Forms.DataGridViewHitTestType]::Cell) 
     { 
      $DataGrid1.CurrentCell = $DataGrid1[$hit.ColumnIndex, $hit.RowIndex]; 
      $contextMenuStrip1.Show($DataGrid1, $e.X, $e.Y); 
     } 

    } 
}) 




#***************************************************************# 
$form.Controls.Add($DataGrid1) 
$form.ShowDialog() | out-null 
+0

ありがとう!あなたのコードは、私が探していた動作のタイプの良い例を示していて、私が見てきたすべてのC#の例をPowerShellに変換する方法についていくつかのアイデアをくれました。 – CuriousOne

-2

は、最小限のC#の例です

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

namespace DataGridViewContextMenu_45574948 
{ 
    public partial class Form1 : Form 
    { 
     BindingList<dgvitem> dgvitems = new BindingList<dgvitem>(); 
     DataGridView dgv = new DataGridView(); 

     public Form1() 
     { 
      InitializeComponent(); 
      InitializeTheGrid(); 
     } 

     private void InitializeTheGrid() 
     { 
      dgv.AutoGenerateColumns = true; 
      dgv.DataSource = dgvitems; 
      dgv.CellMouseClick += Dgv_CellMouseClick; 
      this.Controls.Add(dgv); 
     } 

     private void Dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Right) 
      { 
       ContextMenu cm = new ContextMenu(); 
       MenuItem mi = new MenuItem(); 
       mi.Text = "Menu option 1"; 
       mi.Click += MenuItem1Click; 
       cm.MenuItems.Add(mi); 
       mi = new MenuItem(); 
       mi.Text = "Menu option 2"; 
       mi.Click += MenuItem2Click; 
       cm.MenuItems.Add(mi); 
       cm.Show(dgv, new Point(e.Location.X + 10, e.Location.Y + 10)); 
      } 
     } 

     private void MenuItem2Click(object sender, EventArgs e) 
     { 
      //do something here 
     } 

     private void MenuItem1Click(object sender, EventArgs e) 
     { 
      //do something here 
     } 
    } 

    public class dgvitem 
    { 
     public string col1 { get; set; } 
     public string col2 { get; set; } 
     public string col3 { get; set; } 
    } 
} 
+0

ダウン投票に行く場合は、少なくともそれを役に立つコメントでバックアップしてください。 –

+0

あなたの答えはPowerShellではなくC#です。それはおそらくそれがdownvoted得た理由です。 – CuriousOne

関連する問題