设置datagrid的行背景颜色WPF - Loop

问题描述:

我有一个Task,它抛出DataGridRow并执行一些任务。当他完成时,为该行设置background color。我添加了取消button来停止任务,并继续button继续上次完成的地方。除了更改行的背景颜色,所有工作都很完美。设置datagrid的行背景颜色WPF - Loop

这是XAML代码,我是新来WPF所以它不是太大DataGrid

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

这里是改变背景颜色的C#代码。

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

此代码的工作,当我点击开始Button并改变它的颜色Background每个。问题是当我点击取消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工作。

UPDATE: 代码取消Button

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

代码继续Button

 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

你能发布您的代码完全 - 无论你的取消并继续按钮的代码? – Sach

+0

正如我所说问题不在取消和继续按钮代码。因为当我删除用于更改背景的代码行时,所有工作都会发生取消按钮只发送取消令牌请求。继续我写道:获取'DB Table'中最后一个ID的3个字符串并用foreach循环调用任务 – MiOnIs

+0

这不是重点;我无法重现您的问题,并且/或者在没有看到完整图片的情况下尝试找出问题。您的问题首先难以理解。 – Sach

我解决了这个问题。所以问题是因为我用0123填充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://*.com/help/asking)。它将帮助您获取所需的信息,同时还帮助其他遇到类似问题的人。这就是Stack Overflow的全部意义;) – Ewoud

+0

@Maverik我等了太久的回答,我没有得到它。所以我找到我的解决方案。那么我会学习,但我刚刚开始使用WPF – MiOnIs

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变量两次。也就是说,如果您使用if语句,则只需增加一次,然后在循环结束时再增加一次。所以,无论你何时进入if声明,你的行计数都会增加两倍。

这就是为什么你的计数器会达到比实际行数更高的值。您需要删除if语句中的增量。

+0

你知道继续做什么吗?我需要这个增量,因为我无法确切地得到'Row',其中是循环的瞬间。我从来没有在一个循环中增加两次'号码'。阅读有关[继续](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/continue)。 – MiOnIs

+0

我也将'.ContainerFromIndex(number);'改为'.ContainerFromItem(group);',它的工作方式与'.ContainerFromIndex(number);' – MiOnIs

+5

-1:我觉得对于2K代表来说真的很奇怪人发布双重“答案”,这些答案实际上并不是答案。如何在不了解SO的基本Q&A规则的情况下耙出代表? – Maverik