2013-06-18 4 views
0

C#을 사용하여 DataGridView의 특정 열을 마우스 오른쪽 단추로 클릭 할 때 ContextMenuStrip (CMS) 만 표시하려고합니다. 내가 DataGridView_CellContentClick 및/또는 dataGridView1.HitTest()을 사용해야하는지 혼란 스럽습니다. 그런 다음 마우스 오른쪽 버튼으로 클릭 한 셀의 데이터를 새 양식 창으로 보내고 싶습니다.DataGridView ContextMenuStrip의 특정 열을 마우스 오른쪽 단추로 클릭

현재 코드에 이상한 동작이 있습니다. 첫 번째로 클릭하거나 네 번째 열을 마우스 오른쪽 버튼으로 클릭하지 않으면 CMS가 표시되지 않습니다. 그러나 일단 그것이 있으면 오른쪽 클릭에 항상 CMS가 표시됩니다.

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex == 4) 
     { 
      //Create the ContextStripMenu for Creating the PO Sub Form 
      ContextMenuStrip Menu = new ContextMenuStrip(); 
      ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO"); 
      //Assign event handlers 
      MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click); 
      Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO }); 
      //Assign created context menu strip to the Datagrid 
      dataGridView1.ContextMenuStrip = Menu; 
     } 
    } 

    void MenuOpenPO_Click(object sender, MouseEventArgs e) 
    { 
     var ht = dataGridView1.HitTest(e.X, e.Y); 

       MessageBox.Show("Hello2"); 
       PO_Form POWindow = new PO_Form(); 
       POWindow.Show(); 
    } 

나는 셀 값을 잡기 위해 var ht = dataGridView1.HitTest(e.X, e.Y);을 사용하려고했다.

감사합니다. 감사합니다.

편집 1 그래서 dataGridView1_CellContentClick을 업데이트하여 찾고자하는 동작에 매우 가깝습니다. 처음 4 열을 클릭하면 다음 오른쪽 클릭하면 내 CMS가 나타납니다. 다른 열의 다른 셀을 클릭하면 CMS가 더 이상 존재하지 않습니다. 그러나 난 그냥 CMS를 만들려면 먼저 왼쪽을 클릭하지 않고 열 4에서 셀을 마우스 오른쪽 단추로 수 싶습니다. 나는 VB에서 이런 짓을

 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex == 4) 
     { 
      //MessageBox.Show("Hello1"); 
      //Create the ContextStripMenu for Creating the PO Sub Form 
      ContextMenuStrip Menu = new ContextMenuStrip(); 
      ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO"); 
      //Assign event handlers 
      MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click); 
      Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO }); 
      //Assign created context menu strip to the Datagrid 
      dataGridView1.ContextMenuStrip = Menu; 
     } 

     else 
      dataGridView1.ContextMenuStrip = null; 
    } 
+0

나는 당신이 원하는 것을 실제로 얻지 못합니까? 마우스에서 마우스 오른쪽 버튼을 클릭하면 어떤 데이터를 셀에서 가져 오려고합니까? –

+0

ContextMenuStrip (CMS)에서 네 번째 열이 오른쪽 클릭 된 경우에만 표시되기를 원합니다. 그런 다음 CMS에서 "Open PO"를 클릭하고 해당 오른쪽 클릭 셀의 데이터를 새 Windows 양식으로 보내도록하고 싶습니다. – Matt

답변

0

난 내 자신의 문제를 파악하고 그래서 솔루션을 게시 할 예정입니다. 불행히도 나는 C# 프로그래밍에서 매우 새롭고 일반적으로 매우 녹슬었다. 이벤트 핸들러 (정확한 이름이 맞는지 확실하지 않음), MouseEventArgs, EventArgs, KeyEventArgs 등을 사용하는지에 따라 어떻게 달라지는 지에 대해 고민했습니다. 어쨌든 저는 빗나가 다.

내 솔루션은 아래입니다. 나는 dataGridView1.MouseUp을 사용하여 가난한 사용자 상호 작용 결과를 주 변화를위한 각 행동 중 2 번을 요구하는 것으로 나타났습니다. 정확한 coloumn이 오른쪽 클릭되면 IE에서 ContextMenuStrip을 만듭니다. 또는 다른 열을 마우스 오른쪽 버튼으로 클릭하면 사라집니다. 더 나은 결과를 얻으려면 dataGridView1.MouseDown을 사용하십시오.

dataGridView1.MouseDown += new MouseEventHandler(this.dataGridView_MouseDown); 

    private void dataGridView_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      var ht = dataGridView1.HitTest(e.X, e.Y); 

      if (ht.ColumnIndex == 4) 
      { 
       //Create the ContextStripMenu for Creating the PO Sub Form 
       ContextMenuStrip Menu = new ContextMenuStrip(); 
       ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO"); 
       MenuOpenPO.MouseDown += new MouseEventHandler(MenuOpenPO_Click); 
       Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO }); 
       //Assign created context menu strip to the DataGridView 
       dataGridView1.ContextMenuStrip = Menu; 
      } 

      else 
       dataGridView1.ContextMenuStrip = null; 
     } 
    } 

당신이 뭔가 다른 나는이 이벤트 핸들러를 생성 한 후 다음 사용하여 ContextMenuStrip을 클릭 할 때 나는 다음과 같은 코드를 사용하는 새로운 형태를 만들거나하고 싶은 경우

? MenuOpenPO.MouseDown += new MouseEventHandler(MenuOpenPO_Click);

void MenuOpenPO_Click(object sender, MouseEventArgs e) 
    { 
     PO_Form POWindow = new PO_Form(); 
     POWindow.Show(); 
    } 
0

..

Private Sub DGV_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DGV.CellMouseClick 
    If e.Button = Windows.Forms.MouseButtons.Right Then 

     DGV.CurrentCell = DGV.Rows(e.RowIndex).Cells(e.ColumnIndex) 

     CMS.Show(DGV, DGV.PointToClient(Windows.Forms.Cursor.Position)) 

    End If 
End Sub 
+0

OP가 C#의 질문에 태그를 달았습니다. 왜이 답변이 괜찮다고 생각하십니까? –

+0

@KingKing .. 왜 내가 처음 'VB에서'라고 말한거야 .. 그냥 매트가 아이디어를 얻을 수 있기를 바란다. 그리고 내 대답은 괜찮다고 언급하지 않았다. – matzone

+0

불행히도 나는 아주 강한 프로그래머가 아니며 단지 그렇게하고있다. 희귀 한 경우이지만 재미 있고 즐겁습니다. 하나의 언어에서 VB로 이동하려면 경험이없는 C#을 사용하면 큰 도움이됩니다. 내 첫 번째 문제는 내가 datagridview 이벤트를 사용하여 contextmenustrip이 나타나거나 datagridview HitTest로 그 결과를 얻을 수있는 경우 제한 할 수 있는지 확인하는 것입니다. – Matt

관련 문제