2016-08-18 11 views
0

私はReadOnly DataGridViewをbindingSourceにバインドしています。 DataGridViewCellを更新するフォームには、他のコントロールがあります。これらのコントロールはバインディングソースにバインドされています。私はdatagridviewCellのスタイルを元のDataViewRowStateに基づいて変更する必要があります - .Currentは私を助けません - 私は何をする必要があるトラックは、元の値をセルです - セルの正常な色、 。私は取得しているバージョンのDataRowViewStateを得ることができることを知っています - しかし、それは常に最新のものになります(デフォルトであるので)。そして、現在のものが必要です - 私はそれがオリジナルと異なるかどうかを知りたいこの特定の列。バインディングソースの私の編集ではすでに行があるので、この行が元の、または変更されたという簡単なメソッドまたはプロパティではないようです。私は行を取得し、結果を得るかどうかを確認するためにテーブル上のfilterstatesを使用してselectを実行する必要がありますか?そうしたければ、これを行うにはセルを変更しますか?DataViewRowStateを使用してDataGridViewCellにスタイルを割り当てる

関連するコード:VB.netであることは知っていますが、C#の例があれば気にしません.netコードはコードであり、変換できます。

Private Sub UpdateCellValue(columnName As String, textValue As String) 

    If dgvBayList.SelectedRows.Count > 0 Then 
     Dim crow As DataGridViewRow = dgvBayList.SelectedRows(0) 
     Dim drv As DataRowView = DirectCast(bsBins.Current, DataRowView) 

     If crow.Cells(columnName).Value = textValue Then 
      Exit Sub 
     End If 

     drv.BeginEdit() 
     drv.Row.BeginEdit() 
     drv.Row.SetField(Of String)(columnName, textValue) 
     ' My Problem here is of course it is always original, 
     ' the row states of the Row always show Modified. 
     ' This happens when the binding source gets filled and bound to datagridview. 

     Select Case drv.RowVersion 
      Case DataRowVersion.Original 
       Dim val As String = drv.Row(0).ToString() 
       Exit Select 
      Case DataRowVersion.Proposed 
       Dim val As String = drv.Row(0).ToString() 
       Exit Select 
      Case DataRowVersion.Current 
       Dim val As String = drv.Row(0).ToString() 
       Exit Select 
      Case DataRowVersion.Default 
       Dim val As String = drv.Row(0).ToString() 
       Exit Select 
     End Select 
     crow.Cells(columnName).Value = textValue 
     drv.Row.EndEdit() 
     drv.EndEdit() 
     Dim dt As DataTable = sortingDataSet.bins 

    End If 

End Sub 
+1

を助けた関連リンクこの

UpdateCellValue(Of Boolean)("kickingIt", True) 

のようにそれを呼び出します.RowVersion – Steve

+0

@Steve私のRowStateは常に変更されています修正前でもなぜこのようなものなのか分かりません。バインディングソースは、フォームloadで埋められるdataset.Tableにバインドされています。それはいつも変更をget goから宣言しているので、それは私を助けません。また、ユーザーがオリジナルに戻したかどうかを知る必要があります。通常の変更されていないセルのように見えます。私はrowfilterを使用して選択する必要があると思っています - より簡単な方法が必要です。私は1つがあることを願う。 – Ken

+0

セルの書式設定イベントで 'RowState'を見ると、うまく動作します。 – Plutonix

答えて

0

のコメントを見て、検索するためのさまざまな思考を使用した後、私は解決策How can I get a specific version of a dataset row?の一部を提供SOの答えを見つけました。

このソリューションを実装するためには、実行時までTが不明な汎用関数を呼び出すためのメカニズムを設定する必要がありました。 SOをもう一度見た後、私はそれについていくつかの良い答えを見つけました。 How do I use reflection to call a generic method?

以下は私が使用する最終コードです。変更した値から、datagridviewの変更を実装し、元の値または提案された値に基づいて個々のセルにスタイルを適用しました。

Private Sub UpdateCellValue(Of T)(columnName As String, value As T) 

    If dgvBayList.SelectedRows.Count > 0 Then 

     Dim crow As DataGridViewRow = dgvBayList.SelectedRows(0) 

     Dim drv As DataRowView = DirectCast(bsDataSource.Current, DataRowView) 

     If crow.Cells(columnName).Value = value Then 
      Exit Sub 
     End If 

     drv.BeginEdit() 

     drv.Row.BeginEdit() 

     drv.Row.SetField(Of T)(columnName, value) 

     crow.Cells(columnName).Value = value 

     Dim objType As Type = drv.Row(columnName).GetType() 

     Dim method As Reflection.MethodInfo = _ 
       Me.GetType().GetMethod("SetDataGridViewCellStyle", _ 
       Reflection.BindingFlags.Instance Or _ 
       Reflection.BindingFlags.NonPublic Or _ 
       Reflection.BindingFlags.Public) 

     Dim GenericSetDataGridViewCellStyle As Reflection.MethodInfo = _ 
               method.MakeGenericMethod(objType) 

     Dim parms As Object() = {crow.Cells(columnName), drv, columnName} 

     GenericSetDataGridViewCellStyle.Invoke(Me, parms) 

     drv.Row.EndEdit() 
     drv.EndEdit() 
    End If 

End Sub 

Private Sub SetDataGridViewCellStyle(Of T) (_ 
          cell As DataGridViewCell, _ 
          dRowView As DataRowView, _ 
          columnName As String) 

    Dim nothingness As Integer = 0 

    If dRowView.Row.Field(Of T)(columnName, DataRowVersion.Original) Is Nothing Then 
     nothingness += 1 
    End If 

    If dRowView.Row.Field(Of T)(columnName, DataRowVersion.Current) Is Nothing Then 
     nothingness += 1 
    End If 

    If nothingness = 0 Then 

     Dim original As T = dRowView.Row.Field(Of T)(columnName, DataRowVersion.Original) 
     Dim current As T = dRowView.Row.Field(Of T)(columnName, DataRowVersion.Current) 
     Dim proposed As T = dRowView.Row.Field(Of T)(columnName, DataRowVersion.Proposed) 

     If EqualsCompare(Of T)(original, proposed) Then 

      cell.Style.BackColor = Color.FromKnownColor(KnownColor.White) 

     Else 

      cell.Style.BackColor = Color.FromKnownColor(KnownColor.Fuchsia) 

     End If 

    Else 
     If nothingness = 2 Then 

      cell.Style.BackColor = Color.FromKnownColor(KnownColor.White) 
     Else 
      ' cell.Style.BackColor = Color.FromKnownColor(KnownColor.Fuchsia)' 
     End If 

    End If 

    cell.DataGridView.Update() 

End Sub 

Public Shared Function EqualsCompare(Of T)(a As T, b As T) As Boolean 

    Return EqualityComparer(Of T).[Default].Equals(a, b) 

End Function 

と私はあなたがDRV drv.Row.RowStateをする必要はないようだ私に

How can I get a specific version of a dataset row?

How do I use reflection to call a generic method?

関連する問題