DataGridView.SelectionChanged 事件

定義

目前選取範圍變更時發生。Occurs when the current selection changes.

public:
 event EventHandler ^ SelectionChanged;
public event EventHandler SelectionChanged;
member this.SelectionChanged : EventHandler 
Public Custom Event SelectionChanged As EventHandler 

範例

下列程式碼範例示範如何使用這個事件。The following code example demonstrates the use of this event. 在此範例中,表單會顯示所選儲存格中值的總和,並在選取範圍變更時更新總和。In the example, the form displays the sum of values in the selected cells, and updates the sum when the selection changes.

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

public class Form1 : Form
{
    private DataGridView DataGridView1 = new DataGridView();
    private FlowLayoutPanel FlowLayoutPanel1 = new FlowLayoutPanel();
    private Label Label1 = new Label();
    private Label Label2 = new Label();
    private Label Label3 = new Label();
    private Label Label4 = new Label();

    // Establish the main entry point for the application.
    [STAThreadAttribute()]
    public static void Main()
    {
        Application.Run(new Form1());
    }

    public Form1()
    {
        // Initialize the form.
        // This code can be replaced with designer generated code.
        AutoSize = true;

        // Set the FlowLayoutPanel1 properties.
        FlowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
        FlowLayoutPanel1.Location = new System.Drawing.Point(354, 0);
        FlowLayoutPanel1.AutoSize = true;
        FlowLayoutPanel1.Controls.Add(Label1);
        FlowLayoutPanel1.Controls.Add(Label2);
        FlowLayoutPanel1.Controls.Add(Label3);
        FlowLayoutPanel1.Controls.Add(Label4);

        Controls.Add(FlowLayoutPanel1);
        Controls.Add(DataGridView1);

        // Set the Label properties.
        Label1.AutoSize = true;
        Label2.AutoSize = true;
        Label3.AutoSize = true;
    }

    protected override void OnLoad(EventArgs e)
    {
        PopulateDataGridView();
        UpdateLabelText();
        UpdateBalance();

        DataGridView1.CellValidating += new
            DataGridViewCellValidatingEventHandler(
            DataGridView1_CellValidating);
        DataGridView1.CellValidated += new DataGridViewCellEventHandler(
            DataGridView1_CellValidated);
        DataGridView1.CellValueChanged += new DataGridViewCellEventHandler(
            DataGridView1_CellValueChanged);
        DataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(
            DataGridView1_RowsRemoved);
        DataGridView1.SelectionChanged += new EventHandler(
            DataGridView1_SelectionChanged);
        DataGridView1.UserAddedRow += new DataGridViewRowEventHandler(
            DataGridView1_UserAddedRow);
        DataGridView1.UserDeletingRow += new
            DataGridViewRowCancelEventHandler(DataGridView1_UserDeletingRow);

        base.OnLoad(e);
    }

    // Replace this with your own code to populate the DataGridView.
    private void PopulateDataGridView()
    {
        DataGridView1.Size = new Size(350, 400);
        DataGridView1.AllowUserToDeleteRows = true;

        // Add columns to the DataGridView.
        DataGridView1.ColumnCount = 4;
        DataGridView1.SelectionMode =
            DataGridViewSelectionMode.RowHeaderSelect;

        // Set the properties of the DataGridView columns.
        DataGridView1.Columns[0].Name = "Description";
        DataGridView1.Columns[1].Name = "Withdrawals";
        DataGridView1.Columns[2].Name = "Deposits";
        DataGridView1.Columns[3].Name = "Balance";
        DataGridView1.Columns["Description"].HeaderText = "Description";
        DataGridView1.Columns["Withdrawals"].HeaderText = "W(-)";
        DataGridView1.Columns["Deposits"].HeaderText = "D(+)";
        DataGridView1.Columns["Balance"].HeaderText = "Balance";
        DataGridView1.Columns["Balance"].ReadOnly = true;
        DataGridView1.Columns["Description"].SortMode =
            DataGridViewColumnSortMode.NotSortable;
        DataGridView1.Columns["Withdrawals"].SortMode =
            DataGridViewColumnSortMode.NotSortable;
        DataGridView1.Columns["Deposits"].SortMode =
            DataGridViewColumnSortMode.NotSortable;
        DataGridView1.Columns["Balance"].SortMode =
            DataGridViewColumnSortMode.NotSortable;

        // Add rows of data to the DataGridView.
        DataGridView1.Rows.Add(new string[] {
            "Starting Balance", "", "", "1000" });
        DataGridView1.Rows.Add(new string[] {
            "Paycheck Deposit", "", "850", "" });
        DataGridView1.Rows.Add(new string[] { "Rent", "-500", "", "" });
        DataGridView1.Rows.Add(new string[] { "Groceries", "-25", "", "" });
        DataGridView1.Rows.Add(new string[] { "Tax Return", "", "300", "" });


        // Allow the user to edit the starting balance cell
        DataGridView1.Rows[0].ReadOnly = true;
        DataGridView1.Rows[0].Cells["Balance"].ReadOnly = false;

        // Autosize the columns.
        DataGridView1.AutoResizeColumns();
    }

    private void DataGridView1_CellValueChanged(
        object sender, DataGridViewCellEventArgs e)
    {
        // Update the balance column whenever the value of any cell changes.
        UpdateBalance();
    }

    private void DataGridView1_RowsRemoved(
        object sender, DataGridViewRowsRemovedEventArgs e)
    {
        // Update the balance column whenever rows are deleted.
        UpdateBalance();
    }

    private void UpdateBalance()
    {
        int counter;
        int balance;
        int deposit;
        int withdrawal;

        // Iterate through the rows, skipping the Starting Balance row.
        for (counter = 1; counter < (DataGridView1.Rows.Count - 1);
            counter++)
        {
            deposit = 0;
            withdrawal = 0;
            balance = int.Parse(DataGridView1.Rows[counter - 1]
                .Cells["Balance"].Value.ToString());

            if (DataGridView1.Rows[counter].Cells["Deposits"].Value != null)
            {
                // Verify that the cell value is not an empty string.
                if (DataGridView1.Rows[counter]
                    .Cells["Deposits"].Value.ToString().Length != 0)
                {
                    deposit = int.Parse(DataGridView1.Rows[counter]
                        .Cells["Deposits"].Value.ToString());
                }
            }

            if (DataGridView1.Rows[counter].Cells["Withdrawals"].Value != null)
            {
                if (DataGridView1.Rows[counter]
                    .Cells["Withdrawals"].Value.ToString().Length != 0)
                {
                    withdrawal = int.Parse(DataGridView1.Rows[counter]
                        .Cells["Withdrawals"].Value.ToString());
                }
            }
            DataGridView1.Rows[counter].Cells["Balance"].Value =
                (balance + deposit + withdrawal).ToString();
        }
    }

    private void DataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        // Update the labels to reflect changes to the selection.
        UpdateLabelText();
    }

    private void DataGridView1_UserAddedRow(
        object sender, DataGridViewRowEventArgs e)
    {
        // Update the labels to reflect changes to the number of entries.
        UpdateLabelText();
    }

    private void UpdateLabelText()
    {
        int WithdrawalTotal = 0;
        int DepositTotal = 0;
        int SelectedCellTotal = 0;
        int counter;

        // Iterate through all the rows and sum up the appropriate columns.
        for (counter = 0; counter < (DataGridView1.Rows.Count);
            counter++)
        {
            if (DataGridView1.Rows[counter].Cells["Withdrawals"].Value
                != null)
            {
                if (DataGridView1.Rows[counter].
                    Cells["Withdrawals"].Value.ToString().Length != 0)
                {
                    WithdrawalTotal += int.Parse(DataGridView1.Rows[counter].
                        Cells["Withdrawals"].Value.ToString());
                }
            }

            if (DataGridView1.Rows[counter].Cells["Deposits"].Value != null)
            {
                if (DataGridView1.Rows[counter]
                    .Cells["Deposits"].Value.ToString().Length != 0)
                {
                    DepositTotal += int.Parse(DataGridView1.Rows[counter]
                        .Cells["Deposits"].Value.ToString());
                }
            }
        }

        // Iterate through the SelectedCells collection and sum up the values.
        for (counter = 0;
            counter < (DataGridView1.SelectedCells.Count); counter++)
        {
            if (DataGridView1.SelectedCells[counter].FormattedValueType ==
                Type.GetType("System.String"))
            {
                string value = null;

                // If the cell contains a value that has not been commited,
                // use the modified value.
                if (DataGridView1.IsCurrentCellDirty == true)
                {

                    value = DataGridView1.SelectedCells[counter]
                        .EditedFormattedValue.ToString();
                }
                else
                {
                    value = DataGridView1.SelectedCells[counter]
                        .FormattedValue.ToString();
                }
                if (value != null)
                {
                    // Ignore cells in the Description column.
                    if (DataGridView1.SelectedCells[counter].ColumnIndex !=
                        DataGridView1.Columns["Description"].Index)
                    {
                        if (value.Length != 0)
                        {
                            SelectedCellTotal += int.Parse(value);
                        }
                    }
                }
            }
        }

        // Set the labels to reflect the current state of the DataGridView.
        Label1.Text = "Withdrawals Total: " + WithdrawalTotal.ToString();
        Label2.Text = "Deposits Total: " + DepositTotal.ToString();
        Label3.Text = "Selected Cells Total: " + SelectedCellTotal.ToString();
        Label4.Text = "Total entries: " + DataGridView1.RowCount.ToString();
    }

    private void DataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        int testint;

        if (e.ColumnIndex != 0)
        {
            if (e.FormattedValue.ToString().Length != 0)
            {
                // Try to convert the cell value to an int.
                if (!int.TryParse(e.FormattedValue.ToString(), out testint))
                {
                    DataGridView1.Rows[e.RowIndex].ErrorText =
                        "Error: Invalid entry";
                    e.Cancel = true;
                }
            }
        }
    }

    private void DataGridView1_CellValidated(object sender,
        DataGridViewCellEventArgs e)
    {
        // Clear any error messages that may have been set in cell validation.
        DataGridView1.Rows[e.RowIndex].ErrorText = null;
    }

    private void DataGridView1_UserDeletingRow(object sender,
        DataGridViewRowCancelEventArgs e)
    {
        DataGridViewRow startingBalanceRow = DataGridView1.Rows[0];

        // Check if the Starting Balance row is included in the selected rows
        if (DataGridView1.SelectedRows.Contains(startingBalanceRow))
        {
            // Do not allow the user to delete the Starting Balance row.
            MessageBox.Show("Cannot delete Starting Balance row!");

            // Cancel the deletion if the Starting Balance row is included.
            e.Cancel = true;
        }
    }

}
Imports System.Drawing
Imports System.Windows.Forms

Public Class Form1
    Inherits Form

    Private WithEvents DataGridView1 As New DataGridView()
    Private FlowLayoutPanel1 As New FlowLayoutPanel()
    Private Label1 As New Label()
    Private Label2 As New Label()
    Private Label3 As New Label()
    Private Label4 As New Label()

    ' Establish the main entry point for the application.
    <STAThreadAttribute()> _
    Public Shared Sub Main()
        Application.Run(New Form1())
    End Sub

    Public Sub New()

        ' Set the FlowLayoutPanel1 properties.
        With Me
            .AutoSize = True

            With .FlowLayoutPanel1
                .FlowDirection = FlowDirection.TopDown
                .Location = New System.Drawing.Point(354, 0)
                .AutoSize = True
                .Controls.Add(Label1)
                .Controls.Add(Label2)
                .Controls.Add(Label3)
                .Controls.Add(Label4)
            End With

            .Controls.Add(Me.FlowLayoutPanel1)
            .Controls.Add(DataGridView1)


            ' Set the Label properties.
            .Label1.AutoSize = True
            .Label2.AutoSize = True
            .Label3.AutoSize = True

            .PopulateDataGridView()
            .UpdateLabelText()
            .UpdateBalance()
        End With
    End Sub

    ' Replace this with your own code to populate the DataGridView.
    Private Sub PopulateDataGridView()
        With Me.DataGridView1
            .Size = New Size(350, 400)
            .AllowUserToDeleteRows = True

            ' Add columns to the DataGridView.
            .ColumnCount = 4
            .SelectionMode = DataGridViewSelectionMode.RowHeaderSelect

            ' Set the properties of the DataGridView columns.
            .Columns(0).Name = "Description"
            .Columns(1).Name = "Withdrawals"
            .Columns(2).Name = "Deposits"
            .Columns(3).Name = "Balance"
            .Columns("Description").HeaderText = "Description"
            .Columns("Withdrawals").HeaderText = "W(-)"
            .Columns("Deposits").HeaderText = "D(+)"
            .Columns("Balance").HeaderText = "Balance"
            .Columns("Balance").ReadOnly = True
            .Columns("Description").SortMode = _
                DataGridViewColumnSortMode.NotSortable
            .Columns("Withdrawals").SortMode = _
                DataGridViewColumnSortMode.NotSortable
            .Columns("Deposits").SortMode = _
                DataGridViewColumnSortMode.NotSortable
            .Columns("Balance").SortMode = _
                DataGridViewColumnSortMode.NotSortable
        End With

        ' Add rows of data to the DataGridView.
        With Me.DataGridView1.Rows
            .Add(New String() {"Starting Balance", "", "", "1000"})
            .Add(New String() {"Paycheck Deposit", "", "850", ""})
            .Add(New String() {"Rent", "-500", "", ""})
            .Add(New String() {"Groceries", "-25", "", ""})
            .Add(New String() {"Tax Return", "", "300", ""})
        End With

        ' Allow the user to edit the starting balance cell
        DataGridView1.Rows(0).ReadOnly = True
        DataGridView1.Rows(0).Cells("Balance").ReadOnly = False

        ' Autosize the columns.
        Me.DataGridView1.AutoResizeColumns()

    End Sub

    Private Sub CellValueChanged(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellValueChanged

        ' Update the balance column whenever the values of any cell changes.
        UpdateBalance()
    End Sub

    Private Sub RowsRemoved(ByVal sender As Object, _
        ByVal e As DataGridViewRowsRemovedEventArgs) _
        Handles DataGridView1.RowsRemoved

        ' Update the balance column whenever rows are deleted.
        UpdateBalance()
    End Sub

    Private Sub UpdateBalance()
        Dim counter As Integer
        Dim balance As Integer
        Dim deposit As Integer
        Dim withdrawal As Integer

        ' Iterate through the rows, skipping the Starting Balance Row.
        For counter = 1 To (DataGridView1.Rows.Count - 2)
            deposit = 0
            withdrawal = 0
            balance = Integer.Parse(DataGridView1.Rows(counter - 1) _
                .Cells("Balance").Value.ToString())

            If Not DataGridView1.Rows(counter) _
                .Cells("Deposits").Value Is Nothing Then

                ' Verify that the cell value is not an empty string.
                If Not DataGridView1.Rows(counter) _
                    .Cells("Deposits").Value.ToString().Length = 0 Then
                    deposit = Integer.Parse(DataGridView1.Rows(counter) _
                        .Cells("Deposits").Value.ToString())
                End If
            End If

            If Not DataGridView1.Rows(counter) _
                .Cells("Withdrawals").Value Is Nothing Then
                If Not DataGridView1.Rows(counter) _
                    .Cells("Withdrawals").Value.ToString().Length = 0 Then
                    withdrawal = Integer.Parse(DataGridView1.Rows(counter) _
                        .Cells("Withdrawals").Value.ToString())
                End If
            End If

            DataGridView1.Rows(counter).Cells("Balance").Value = _
                (balance + deposit + withdrawal).ToString()
        Next
    End Sub

    Private Sub SelectionChanged(ByVal sender As Object, _
        ByVal e As EventArgs) Handles DataGridView1.SelectionChanged

        ' Update the labels to reflect changes to the selection.
        UpdateLabelText()
    End Sub

    Private Sub UserAddedRow(ByVal sender As Object, _
        ByVal e As DataGridViewRowEventArgs) _
        Handles DataGridView1.UserAddedRow

        ' Update the labels to reflect changes to the number of entries.
        UpdateLabelText()
    End Sub

    Private Sub UpdateLabelText()
        Dim WithdrawalTotal As Integer = 0
        Dim DepositTotal As Integer = 0
        Dim SelectedCellTotal As Integer = 0
        Dim counter As Integer

        ' Iterate through all the rows and sum up the appropriate columns.
        For counter = 0 To (DataGridView1.Rows.Count - 1)
            If Not DataGridView1.Rows(counter) _
                .Cells("Withdrawals").Value Is Nothing Then

                If Not DataGridView1.Rows(counter) _
                    .Cells("Withdrawals").Value.ToString().Length = 0 Then

                    WithdrawalTotal += _
                        Integer.Parse(DataGridView1.Rows(counter) _
                        .Cells("Withdrawals").Value.ToString())
                End If
            End If

            If Not DataGridView1.Rows(counter) _
                .Cells("Deposits").Value Is Nothing Then

                If Not DataGridView1.Rows(counter) _
                    .Cells("Deposits").Value.ToString().Length = 0 Then

                    DepositTotal += _
                        Integer.Parse(DataGridView1.Rows(counter) _
                        .Cells("Deposits").Value.ToString())
                End If
            End If
        Next

        ' Iterate through the SelectedCells collection and sum up the values.
        For counter = 0 To (DataGridView1.SelectedCells.Count - 1)
            If DataGridView1.SelectedCells(counter).FormattedValueType Is _
            Type.GetType("System.String") Then

                Dim value As String = Nothing

                ' If the cell contains a value that has not been commited,
                ' use the modified value.
                If (DataGridView1.IsCurrentCellDirty = True) Then

                    value = DataGridView1.SelectedCells(counter) _
                        .EditedFormattedValue.ToString()
                Else

                    value = DataGridView1.SelectedCells(counter) _
                        .FormattedValue.ToString()
                End If

                If value IsNot Nothing Then

                    ' Ignore cells in the Description column.
                    If Not DataGridView1.SelectedCells(counter).ColumnIndex = _
                        DataGridView1.Columns("Description").Index Then

                        If Not value.Length = 0 Then
                            SelectedCellTotal += Integer.Parse(value)
                        End If
                    End If
                End If
            End If

        Next

        ' Set the labels to reflect the current state of the DataGridView.
        Label1.Text = "Withdrawals Total: " & WithdrawalTotal.ToString()
        Label2.Text = "Deposits Total: " & DepositTotal.ToString()
        Label3.Text = "Selected Cells Total: " & SelectedCellTotal.ToString()
        Label4.Text = "Total entries: " & DataGridView1.RowCount.ToString()
    End Sub

    Private Sub CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles DataGridView1.CellValidating

        Dim testInteger As Integer

        If Not e.ColumnIndex = 0 Then
            If Not e.FormattedValue.ToString().Length = 0 Then

                ' Try to convert the cell value to an Integer.
                If Not Integer.TryParse(e.FormattedValue.ToString(), _
                    testInteger) Then

                    DataGridView1.Rows(e.RowIndex).ErrorText = _
                        "Error: Invalid entry"

                    e.Cancel = True
                End If
            End If
        End If
    End Sub

    Private Sub CellValidated(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellValidated

        ' Clear any error messages that may have been set in cell validation.
        DataGridView1.Rows(e.RowIndex).ErrorText = Nothing
    End Sub

    Private Sub UserDeletingRow(ByVal sender As Object, _
        ByVal e As DataGridViewRowCancelEventArgs) _
        Handles DataGridView1.UserDeletingRow

        Dim startingBalanceRow As DataGridViewRow = DataGridView1.Rows(0)

        ' Check if the starting balance row is included in the selected rows
        If DataGridView1.SelectedRows.Contains(startingBalanceRow) Then
            ' Do not allow the user to delete the Starting Balance row.
            MessageBox.Show("Cannot delete Starting Balance row!")

            ' Cancel the deletion if the Starting Balance row is included.
            e.Cancel = True
        End If
    End Sub

End Class

備註

每當選取儲存格或取消選取專案時(不論是以程式設計方式或使用者動作),就會發生此事件。This event occurs whenever cells are selected or the selection is canceled, whether programmatically or by user action. 例如,當您想要顯示目前選取之儲存格的總和時,這個事件很有用。For example, this event is useful when you want display the sum of the currently selected cells.

當您變更 CurrentCell 屬性的值時,會在 CurrentCellChanged 事件之前發生 SelectionChanged 事件。When you change the value of the CurrentCell property, the SelectionChanged event occurs before the CurrentCellChanged event. 目前存取 CurrentCell 屬性的任何 @no__t 0 事件處理常式都會取得其先前的值。Any SelectionChanged event handler accessing the CurrentCell property at this time will get its previous value.

如需如何處理事件的詳細資訊,請參閱處理和引發事件For more information about how to handle events, see Handling and Raising Events.

適用於

另請參閱