DataGridView.CellContextMenuStripNeeded Zdarzenie

Definicja

Występuje, gdy jest wymagany menu skrótów komórki.Occurs when a cell's shortcut menu is needed.

public:
 event System::Windows::Forms::DataGridViewCellContextMenuStripNeededEventHandler ^ CellContextMenuStripNeeded;
public event System.Windows.Forms.DataGridViewCellContextMenuStripNeededEventHandler CellContextMenuStripNeeded;
member this.CellContextMenuStripNeeded : System.Windows.Forms.DataGridViewCellContextMenuStripNeededEventHandler 
Public Custom Event CellContextMenuStripNeeded As DataGridViewCellContextMenuStripNeededEventHandler 

Typ zdarzenia

DataGridViewCellContextMenuStripNeededEventHandler

Przykłady

Poniższy przykład kodu ilustruje sposób używania CellContextMenuStripNeeded procedury obsługi zdarzeń do wyświetlania niestandardowego menu skrótów, które jest używane, gdy użytkownik kliknie prawym przyciskiem myszy komórkę.The following code example demonstrates how to use a CellContextMenuStripNeeded event handler to display a custom shortcut menu used when the user right-clicks a cell.

ToolStripMenuItem^ wholeTable;
ToolStripMenuItem^ lookUp;
System::Windows::Forms::ContextMenuStrip^ strip;
String^ cellErrorText;

void dataGridView1_CellContextMenuStripNeeded( Object^ /*sender*/,
    DataGridViewCellContextMenuStripNeededEventArgs^ e )
{
    cellErrorText = String::Empty;
    if ( strip == nullptr )
    {
        strip = gcnew System::Windows::Forms::ContextMenuStrip;
        lookUp->Text = L"Look Up";
        wholeTable->Text = L"See Whole Table";
        strip->Items->Add( lookUp );
        strip->Items->Add( wholeTable );
    }

    e->ContextMenuStrip = strip;
}

void wholeTable_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
{
    dataGridView1->DataSource = Populate( L"Select * from employees", true );
}

DataGridViewCellEventArgs^ theCellImHoveringOver;
void dataGridView1_CellMouseEnter( Object^ /*sender*/, DataGridViewCellEventArgs^ e )
{
    theCellImHoveringOver = e;
}

DataGridViewCellEventArgs^ cellErrorLocation;
void lookUp_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
{
    try
    {
        dataGridView1->DataSource = Populate( String::Format( L"Select * from employees where {0} = '{1}'", dataGridView1->Columns[ theCellImHoveringOver->ColumnIndex ]->Name, dataGridView1->Rows[ theCellImHoveringOver->RowIndex ]->Cells[ theCellImHoveringOver->ColumnIndex ]->Value ), true );
    }
    catch ( ... ) 
    {
        cellErrorText = L"Can't look this cell up";
        cellErrorLocation = theCellImHoveringOver;
    }

}

void dataGridView1_CellErrorTextNeeded( Object^ /*sender*/, DataGridViewCellErrorTextNeededEventArgs^ e )
{
    if ( cellErrorLocation != nullptr )
    {
        if ( e->ColumnIndex == cellErrorLocation->ColumnIndex && e->RowIndex == cellErrorLocation->RowIndex )
        {
            e->ErrorText = cellErrorText;
        }
    }
}

DataTable^ Populate( String^ query, bool resetUnsharedCounter )
{
    if ( resetUnsharedCounter )
    {
        ResetCounter();
    }


    // Alter the data source as necessary
    SqlDataAdapter^ adapter = gcnew SqlDataAdapter( query,
        gcnew SqlConnection( L"Integrated Security=SSPI;Persist Security Info=False;"
        L"Initial Catalog=Northwind;Data Source= localhost" ) );
    DataTable^ table = gcnew DataTable;
    adapter->Fill( table );
    return table;
}

Label^ count;
int unsharedRowCounter;
void ResetCounter()
{
    unsharedRowCounter = 0;
    count->Text = unsharedRowCounter.ToString();
}
private ToolStripMenuItem wholeTable = new ToolStripMenuItem();
private ToolStripMenuItem lookUp = new ToolStripMenuItem();
private ContextMenuStrip strip;
private string cellErrorText;

private void dataGridView1_CellContextMenuStripNeeded(object sender,
    DataGridViewCellContextMenuStripNeededEventArgs e)
{
    cellErrorText = String.Empty;

    if (strip == null)
    {
        strip = new ContextMenuStrip();
        lookUp.Text = "Look Up";
        wholeTable.Text = "See Whole Table";
        strip.Items.Add(lookUp);
        strip.Items.Add(wholeTable);
    }
    e.ContextMenuStrip = strip;
}

private void wholeTable_Click(object sender, EventArgs e)
{
    dataGridView1.DataSource = Populate("Select * from employees", true);
}

private DataGridViewCellEventArgs theCellImHoveringOver;

private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
    theCellImHoveringOver = e;
}

private DataGridViewCellEventArgs cellErrorLocation;

private void lookUp_Click(object sender, EventArgs e)
{
    try
    {
        dataGridView1.DataSource = Populate("Select * from employees where " +
            dataGridView1.Columns[theCellImHoveringOver.ColumnIndex].Name + " = '" +
            dataGridView1.Rows[theCellImHoveringOver.RowIndex].
            Cells[theCellImHoveringOver.ColumnIndex].Value + "'",
            true);
    }
    catch (SqlException)
    {
        cellErrorText = "Can't look this cell up";
        cellErrorLocation = theCellImHoveringOver;
    }
}

private void dataGridView1_CellErrorTextNeeded(object sender,
    DataGridViewCellErrorTextNeededEventArgs e)
{
    if (cellErrorLocation != null)
    {
        if (e.ColumnIndex == cellErrorLocation.ColumnIndex &&
            e.RowIndex == cellErrorLocation.RowIndex)
        {
            e.ErrorText = cellErrorText;
        }
    }
}

private DataTable Populate(string query, bool resetUnsharedCounter)
{
    if (resetUnsharedCounter)
    {
        ResetCounter();
    }

    // Alter the data source as necessary
    SqlDataAdapter adapter = new SqlDataAdapter(query,
        new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;" +
        "Initial Catalog=Northwind;Data Source=localhost"));

    DataTable table = new DataTable();
    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
    adapter.Fill(table);
    return table;
}

private Label count = new Label();
private int unsharedRowCounter;

private void ResetCounter()
{
    unsharedRowCounter = 0;
    count.Text = unsharedRowCounter.ToString();
}
Private WithEvents wholeTable As New ToolStripMenuItem()
Private WithEvents lookUp As New ToolStripMenuItem()
Private strip As ContextMenuStrip
Private cellErrorText As String

Private Sub dataGridView1_CellContextMenuStripNeeded(ByVal sender As Object, _
    ByVal e As DataGridViewCellContextMenuStripNeededEventArgs) _
    Handles dataGridView1.CellContextMenuStripNeeded

    cellErrorText = String.Empty

    If strip Is Nothing Then
        strip = New ContextMenuStrip()
        lookUp.Text = "Look Up"
        wholeTable.Text = "See Whole Table"
        strip.Items.Add(lookUp)
        strip.Items.Add(wholeTable)
    End If
    e.ContextMenuStrip = strip
End Sub

Private Sub wholeTable_Click(ByVal sender As Object, ByVal e As EventArgs) Handles wholeTable.Click
    dataGridView1.DataSource = Populate("Select * from employees", True)
End Sub

Private theCellImHoveringOver As DataGridViewCellEventArgs

Private Sub dataGridView1_CellMouseEnter(ByVal sender As Object, _
    ByVal e As DataGridViewCellEventArgs) _
    Handles dataGridView1.CellMouseEnter

    theCellImHoveringOver = e
End Sub

Private cellErrorLocation As DataGridViewCellEventArgs

Private Sub lookUp_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lookUp.Click
    Try
        dataGridView1.DataSource = Populate("Select * from employees where " & _
            dataGridView1.Columns(theCellImHoveringOver.ColumnIndex).Name & " = '" & _
            dataGridView1.Rows(theCellImHoveringOver.RowIndex).Cells(theCellImHoveringOver.ColumnIndex).Value.ToString() & _
            "'", True)
    Catch ex As SqlException
        cellErrorText = "Can't look this cell up"
        cellErrorLocation = theCellImHoveringOver
    End Try
End Sub

Private Sub dataGridView1_CellErrorTextNeeded(ByVal sender As Object, _
            ByVal e As DataGridViewCellErrorTextNeededEventArgs) _
            Handles dataGridView1.CellErrorTextNeeded
    If (Not cellErrorLocation Is Nothing) Then
        If e.ColumnIndex = cellErrorLocation.ColumnIndex AndAlso _
            e.RowIndex = cellErrorLocation.RowIndex Then
            e.ErrorText = cellErrorText
        End If
    End If
End Sub

Private Function Populate(ByVal query As String, ByVal resetUnsharedCounter As Boolean) As DataTable

    If resetUnsharedCounter Then
        ResetCounter()
    End If

    ' Alter the data source as necessary
    Dim adapter As New SqlDataAdapter(query, _
        New SqlConnection("Integrated Security=SSPI;Persist Security Info=False;" & _
        "Initial Catalog=Northwind;Data Source=localhost"))

    Dim table As New DataTable()
    table.Locale = System.Globalization.CultureInfo.InvariantCulture
    adapter.Fill(table)
    Return table
End Function

Private count As New Label()
Private unsharedRowCounter As Integer

Private Sub ResetCounter()
    unsharedRowCounter = 0
    count.Text = unsharedRowCounter.ToString()
End Sub

Uwagi

CellContextMenuStripNeededZdarzenie występuje tylko wtedy, gdy DataGridView Właściwość kontrolki DataSource jest ustawiona lub jej VirtualMode Właściwość jest true .The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.

Po obsłudze CellContextMenuStripNeeded zdarzenia menu skrótów, które określisz w programie obsługi, jest wyświetlane za każdym razem, gdy użytkownik kliknie komórkę prawym przyciskiem myszy.When you handle the CellContextMenuStripNeeded event, the shortcut menu that you specify in the handler is shown whenever the user right-clicks a cell. Jest to przydatne, gdy chcesz wyświetlić menu skrótów określone przez bieżący stan lub wartość komórki.This is useful when you want to display a shortcut menu determined by the current state or value of a cell.

CellContextMenuStripNeededZdarzenie występuje również zawsze, gdy wartość DataGridViewCell.ContextMenuStrip właściwości jest pobierana, programowo lub po kliknięciu prawym przyciskiem myszy komórki.The CellContextMenuStripNeeded event also occurs whenever the value of the DataGridViewCell.ContextMenuStrip property is retrieved, either programmatically or when the user right-clicks a cell.

Możesz użyć DataGridViewCellEventArgs.ColumnIndex właściwości i, RowIndex Aby określić stan lub wartość komórki, a następnie użyć tych informacji, aby zmienić lub zmodyfikować DataGridViewCellContextMenuStripNeededEventArgs.ContextMenuStrip Właściwość.You can use the DataGridViewCellEventArgs.ColumnIndex and RowIndex properties to determine the state or value of a cell, and use this information to change or modify the DataGridViewCellContextMenuStripNeededEventArgs.ContextMenuStrip property. Ta właściwość jest inicjowana przy użyciu wartości właściwości komórki ContextMenuStrip , która zastępuje wartość zdarzenia.This property is initialized with the value of the cell ContextMenuStrip property, which the event value overrides.

Obsłuż CellContextMenuStripNeeded zdarzenie podczas pracy z dużymi ilościami danych, aby uniknąć spadku wydajności dla ustawiania wartości komórki ContextMenuStrip dla wielu komórek.Handle the CellContextMenuStripNeeded event when working with large amounts of data to avoid the performance penalties of setting the cell ContextMenuStrip value for multiple cells. Aby uzyskać więcej informacji, zobacz najlepsze rozwiązania dotyczące skalowania Windows Forms formantu DataGridView.For more information, see Best Practices for Scaling the Windows Forms DataGridView Control.

Możesz również określić menu skrótów dla pojedynczych wierszy, a nie pojedyncze komórki, ustawiając właściwość wiersza ContextMenuStrip lub obsługując RowContextMenuStripNeeded zdarzenie.You can also specify shortcut menus for individual rows rather than individual cells by setting the row ContextMenuStrip property or handling the RowContextMenuStripNeeded event. ContextMenuStripUstawienie właściwości komórki zastępuje ContextMenuStrip ustawienie właściwości wiersza, a CellContextMenuStripNeeded zdarzenie zastępuje RowContextMenuStripNeeded ustawienie właściwości zdarzenie i wiersz ContextMenuStrip .The cell ContextMenuStrip property setting overrides the row ContextMenuStrip property setting, and the CellContextMenuStripNeeded event overrides both the RowContextMenuStripNeeded event and the row ContextMenuStrip property setting. Można jednak określić null dla menu skrótów komórki, aby zapobiec zastąpieniu menu skrótów wierszy.However, you can specify null for a cell shortcut menu to prevent a row shortcut menu from being overridden.

Aby uzyskać więcej informacji o sposobie obsługi zdarzeń, zobacz Obsługa iwywoływanie zdarzeń.For more information about how to handle events, see Handling and Raising Events.

Dotyczy

Zobacz też