2017-07-25 17 views
-3

TaskDataGridRowを投げて何らかの作業をします。彼が終了すると、その行にbackground colorを設定します。キャンセルを追加してbuttonタスクを停止し、最後に終了したところでbuttonを続行します。行の背景色を変更する以外はすべて完璧に動作します。データグリッドの行の背景色を設定するWPF - ループ

これは、XAMLコードで、私はWPFに新たなんだので、それはここでDataGrid

<DataGrid 
    Name="dataGridViewMyGroups" 
    Grid.Row="0" ColumnWidth="*" 
    VerticalScrollBarVisibility="Auto" 
    IsReadOnly="True" 
    SelectionUnit="FullRow" 
    SelectionMode="Single"  
    MouseDoubleClick="dataGridViewMyGroups_MouseDoubleClick"> 
</DataGrid> 

には大きすぎるではありません背景色を変更するためのC#コードです。私はスタートButtonをクリックすると、それは各ためBackground色を変更

DataGridRow rowColor = (DataGridRow)dataGridViewMyGroups.ItemContainerGenerator 
        .ContainerFromIndex(number);         
rowColor.Background = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223, 227, 238)); 

このコード作品。問題は私がButtonのキャンセルをクリックし、次に続行Buttonをクリックすると、私はNullReferenceExceptionを得ました。続行ボタンはDataBase Tableの最後のIDのみをチェックしてください。

int number=0; 
foreach (GroupsInList group in dataGridViewMyGroups.Items) 
{ 
    if (fbgroupID != null && check==true) 
    { 
     number++; 
     if (fbgroupID != groupLink) 
     { 
     continue; 
     } 
     check = false; 
     continue; 
    } 

    //Do something and change background (code above). 
    number++; 
} 

行の背景を変更する以外Button仕事を続けるためのコード。

UPDATEButtonをキャンセルため コード:Buttonを続行ため

if (MessageBox.Show("Do you want to stop posting?", "Confirmation", 
MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) 
     { 
      tokenSource.Cancel(); 
     } 

コード:

 int postID; 
     string fbGroupID; 
     int listID; 

     using (OleDbConnection connection = new OleDbConnection(conn)) 
     { 

      //code for getting value from `DB Table` 

      postID = list[0].PostID; 
      fbGroupID = list[0].FBGroupID; 
      listID = list[0].ListForGroupID; 
     } 

     cmbSelectList.SelectedValue = listID; 
     cmbSavedPosts.SelectedValue = postID; 
     loadGroupsInList(); //Maybe this is problem because here I update(reload) DataGrid again. 

     tokenSource = new CancellationTokenSource(); 

     try 
     {        
      await TaskPostToGroup(tokenSource.Token, fbGroupID, true); 
     } 
     catch (OperationCanceledException ex) 
     { 
      System.Windows.MessageBox.Show(ex.Message, "CANCELED", MessageBoxButton.OK, MessageBoxImage.Stop); 
     } 
     catch (NullReferenceException) 
     { 
      //I don't have solution for changing background color for each row when continue button is clicked 
     } 
     catch (Exception ex) 
     { 
      System.Windows.MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "Exception", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
+0

あなたが完全な形であなたのコードを投稿できる - あなたのキャンセル及びContinueボタンコードの両方を? – Sach

+0

私は問題がキャンセルではなく、ボタンコードを続けると述べています。バックグラウンドを変更するためのコード行を削除するとすべてが機能するからです。キャンセルボタンのみトークンリクエストをキャンセルします。私が書いたように続けてください:最後のIDのための3つの文字列を 'DBテーブル'に入れ、foreachループを使ってタスクを呼び出してください。 – MiOnIs

+0

これは重要なことではありません。私はあなたの問題を再現することはできません、そして/または完全な画像を見ることなく問題を理解しようとすることはできません。あなたの質問は最初は分かりません。 – Sach

答えて

-2

この問題は解決しました。だから問題は私がDataGridを再びデータで満たすためです。代わりに私はそれを記入しない私はIDを取得するだけで、私は前回のテーブルからいくつかのIDで停止した。 Buttonため

コードは続行:

int postID; 
string fbGroupID; 
int listID = int.Parse(cmbSelectList.SelectedValue.ToString()); 

using (OleDbConnection connection = new OleDbConnection(conn)) 
{ 

    ................ 

     commName.CommandText = "SELECT TOP 1 [FaceBookGroupID],[PostID] FROM [Advertiseing] WHERE [email] = @email AND [ListForGroupID]= @listID ORDER BY [Date-Time] DESC"; 

    ................ 

     postID = list[0].PostID; 
     fbGroupID = list[0].FBGroupID;   
     *listID = list[0].ListForGroupID;* //Deleted 
    } 


    //cmbSelectList.SelectedValue = listID; - Deleted 
    cmbSavedPosts.SelectedValue = postID; 
    //loadGroupsInList(); - Deleted 

    // Next part of code are the same 
    ................ 
+5

-1:これは意味をなさない。あなたはこれを間違ってやっている。 MVVMを学ぶ。これを適切に行い、この質問は必要ではないでしょう。さらに悪いことに、あなたの質問に恩恵を与え、実際には答えない答えをあなた自身に授与してください。 – Maverik

+0

私はMaverikに同意し、次回に質問を投稿する前に[link](https://stackoverflow.com/help/asking)も読んでください。それはあなたが必要とする情報を入手し、同様の問題を抱えている他の人たちを助けるのに役立ちます。スタックオーバーフローはすべてについてです;) – Ewoud

+0

@Maverik私は答えがあまりにも長く待っていますが、私はそれを取得しませんでした。だから私は私の解決策を見つける。さて私は学ぶでしょうが、WPFで始まったばかりです – MiOnIs

-1

OK私は、私はあなたの問題は、今あるものを見ると思います。

int number=0; 
foreach (GroupsInList group in dataGridViewMyGroups.Items) 
{ 
    if (fbgroupID != null && check==true) 
    { 
     number++; 
     if (fbgroupID != groupLink) 
     { 
      continue; 
     } 
     check = false; 
     continue; 
    } 
    //Do something and change background (code above). 
    number++; 
} 

あなたのforeachループは、DataGridに行がある回数だけ実行されます。しかし、内部では、ロジックによってはnumber変数を2回インクリメントすることもあります。つまり、ifステートメントを実行すると、そのステートメントを1回増やしてから、ループの最後にもう一度増やします。ですから、ifステートメントに入るたびに、行数が2回増加します。

これは、カウンターが実際の行数よりも高い値になる理由です。 ifステートメント内のインクリメントを削除する必要があります。

+0

あなたは何を続けるのか分かりますか?私は瞬時にループである 'Row'を正確に得ることができないので、その増分が必要です。私は決して一つのループで 'number'を2回増やしません。 [続行](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/continue)を参照してください。 – MiOnIs

+0

'.ContainerFromIndex(number);を' .ContainerFromItem(group);に変更しました。 '' .ContainerFromIndex(number);と同じように動作します。 – MiOnIs

+5

-1:2K担当者にとっては本当に変です実際には答えられない二重の「回答」を投稿する人。あなたはQ&Aの基本的なルールを習得していないのに、どのように担当者をレイクしましたか? – Maverik

関連する問題