次の方法で共有


DataGridView.CellFormatting イベント

定義

セルの内容を表示用に書式設定する必要がある場合に発生します。

public:
 event System::Windows::Forms::DataGridViewCellFormattingEventHandler ^ CellFormatting;
public event System.Windows.Forms.DataGridViewCellFormattingEventHandler CellFormatting;
public event System.Windows.Forms.DataGridViewCellFormattingEventHandler? CellFormatting;
member this.CellFormatting : System.Windows.Forms.DataGridViewCellFormattingEventHandler 
Public Custom Event CellFormatting As DataGridViewCellFormattingEventHandler 

イベントの種類

次のコード例は、 CellFormatting イベントを処理する方法を示しています。

void dataGridView1_CellFormatting( Object^ /*sender*/, DataGridViewCellFormattingEventArgs^ e )
{
   // If the column is the Artist column, check the
   // value.
   if ( this->dataGridView1->Columns[ e->ColumnIndex ]->Name->Equals( "Artist" ) )
   {
      if ( e->Value != nullptr )
      {
         // Check for the string "pink" in the cell.
         String^ stringValue = dynamic_cast<String^>(e->Value);
         stringValue = stringValue->ToLower();
         if ( (stringValue->IndexOf( "pink" ) > -1) )
         {
            DataGridViewCellStyle^ pinkStyle = gcnew DataGridViewCellStyle;

            //Change the style of the cell.
            pinkStyle->BackColor = Color::Pink;
            pinkStyle->ForeColor = Color::Black;
            pinkStyle->Font = gcnew System::Drawing::Font( "Times New Roman",8,FontStyle::Bold );
            e->CellStyle = pinkStyle;
         }
         
      }
   }
   else
   if ( this->dataGridView1->Columns[ e->ColumnIndex ]->Name->Equals( "Release Date" ) )
   {
      ShortFormDateFormat( e );
   }
}


//Even though the date internaly stores the year as YYYY, using formatting, the
//UI can have the format in YY.  
void ShortFormDateFormat( DataGridViewCellFormattingEventArgs^ formatting )
{
   if ( formatting->Value != nullptr )
   {
      try
      {
         System::Text::StringBuilder^ dateString = gcnew System::Text::StringBuilder;
         DateTime theDate = DateTime::Parse( formatting->Value->ToString() );
         dateString->Append( theDate.Month );
         dateString->Append( "/" );
         dateString->Append( theDate.Day );
         dateString->Append( "/" );
         dateString->Append( theDate.Year.ToString()->Substring( 2 ) );
         formatting->Value = dateString->ToString();
         formatting->FormattingApplied = true;
      }
      catch ( Exception^ /*notInDateFormat*/ ) 
      {
         // Set to false in case there are other handlers interested trying to
         // format this DataGridViewCellFormattingEventArgs instance.
         formatting->FormattingApplied = false;
      }

   }
}
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // If the column is the Artist column, check the
    // value.
    if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Artist")
    {
        if (e.Value != null)
        {
            // Check for the string "pink" in the cell.
            string stringValue = (string)e.Value;
            stringValue = stringValue.ToLower();
            if ((stringValue.IndexOf("pink") > -1))
            {
                e.CellStyle.BackColor = Color.Pink;
            }
        }
    }
    else if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Release Date")
    {
        ShortFormDateFormat(e);
    }
}

//Even though the date internaly stores the year as YYYY, using formatting, the
//UI can have the format in YY.  
private static void ShortFormDateFormat(DataGridViewCellFormattingEventArgs formatting)
{
    if (formatting.Value != null)
    {
        try
        {
            System.Text.StringBuilder dateString = new System.Text.StringBuilder();
            DateTime theDate = DateTime.Parse(formatting.Value.ToString());

            dateString.Append(theDate.Month);
            dateString.Append("/");
            dateString.Append(theDate.Day);
            dateString.Append("/");
            dateString.Append(theDate.Year.ToString().Substring(2));
            formatting.Value = dateString.ToString();
            formatting.FormattingApplied = true;
        }
        catch (FormatException)
        {
            // Set to false in case there are other handlers interested trying to
            // format this DataGridViewCellFormattingEventArgs instance.
            formatting.FormattingApplied = false;
        }
    }
}
Private Sub dataGridView1_CellFormatting(ByVal sender As Object, _
    ByVal e As DataGridViewCellFormattingEventArgs) _
    Handles dataGridView1.CellFormatting
    ' If the column is the Artist column, check the
    ' value.
    If Me.dataGridView1.Columns(e.ColumnIndex).Name _
        = "Artist" Then
        If e.Value IsNot Nothing Then

            ' Check for the string "pink" in the cell.
            Dim stringValue As String = _
            CType(e.Value, String)
            stringValue = stringValue.ToLower()
            If ((stringValue.IndexOf("pink") > -1)) Then
                e.CellStyle.BackColor = Color.Pink
            End If

        End If
    ElseIf Me.dataGridView1.Columns(e.ColumnIndex).Name _
        = "Release Date" Then
        ShortFormDateFormat(e)
    End If
End Sub

'Even though the date internaly stores the year as YYYY, using formatting, the
'UI can have the format in YY.  
Private Shared Sub ShortFormDateFormat(ByVal formatting As DataGridViewCellFormattingEventArgs)
    If formatting.Value IsNot Nothing Then
        Try
            Dim dateString As System.Text.StringBuilder = New System.Text.StringBuilder()
            Dim theDate As Date = DateTime.Parse(formatting.Value.ToString())

            dateString.Append(theDate.Month)
            dateString.Append("/")
            dateString.Append(theDate.Day)
            dateString.Append("/")
            dateString.Append(theDate.Year.ToString().Substring(2))
            formatting.Value = dateString.ToString()
            formatting.FormattingApplied = True
        Catch notInDateFormat As FormatException
            ' Set to false in case there are other handlers interested trying to
            ' format this DataGridViewCellFormattingEventArgs instance.
            formatting.FormattingApplied = False
        End Try
    End If
End Sub

注釈

既定では、 DataGridView コントロールは、セルの値を表示に適した形式に変換しようとします。 たとえば、数値をテキスト ボックス セルに表示するための文字列に変換します。 DefaultCellStyle プロパティなどのプロパティによって返されるDataGridViewCellStyleFormat プロパティを設定することで、使用する書式規則を指定できます。

標準の書式設定が不十分な場合は、 CellFormatting イベントを処理して書式設定をカスタマイズできます。 このイベントを使用すると、セルの表示に使用する正確な表示値と、背景色や前景色などのセル スタイルを指定できます。 つまり、セル値自体に書式設定が必要かどうかに関係なく、任意の種類のセル書式設定でこのイベントを処理できます。

CellFormatting イベントは、各セルが描画されるたびに発生するため、このイベントを処理する際に長い処理を避ける必要があります。 このイベントは、セル FormattedValue が取得されるか、その GetFormattedValue メソッドが呼び出されたときにも発生します。

CellFormatting イベントを処理すると、ConvertEventArgs.Value プロパティはセル値で初期化されます。 セル値から表示値へのカスタム変換を指定する場合は、 ConvertEventArgs.Value プロパティを変換後の値に設定し、新しい値がセル FormattedValueType プロパティで指定された型であることを確認します。 それ以上値の書式設定が必要ないことを示すには、 DataGridViewCellFormattingEventArgs.FormattingApplied プロパティを true に設定します。

イベント ハンドラーが完了すると、ConvertEventArgs.Valuenullまたは正しい型ではない場合、またはDataGridViewCellFormattingEventArgs.FormattingAppliedプロパティがfalseされている場合、Valueは、セル InheritedStyle プロパティを使用して初期化される、DataGridViewCellFormattingEventArgs.CellStyle プロパティによって返されるセル スタイルのFormatNullValueDataSourceNullValue、およびFormatProviderプロパティを使用して書式設定されます。

DataGridViewCellFormattingEventArgs.FormattingApplied プロパティの値に関係なく、DataGridViewCellFormattingEventArgs.CellStyle プロパティによって返されるオブジェクトの表示プロパティは、セルのレンダリングに使用されます。

CellFormatting イベントを使用したカスタム書式設定の詳細については、「方法: Windows フォーム DataGridView コントロールでデータの書式設定をカスタマイズする」を参照してください。

このイベントを処理するときにパフォーマンスの低下を回避するには、セルに直接アクセスするのではなく、イベント ハンドラーのパラメーターを使用してセルにアクセスします。

書式設定されたユーザー指定の値から実際のセル値への変換をカスタマイズするには、 CellParsing イベントを処理します。

イベントの処理方法の詳細については、「イベントの 処理と発生」を参照してください。

適用対象

こちらもご覧ください