设置datagrid行背景颜色WPF - 循环[关闭]

Posted

技术标签:

【中文标题】设置datagrid行背景颜色WPF - 循环[关闭]【英文标题】:Set datagrid row background color WPF - Loop [closed] 【发布时间】:2017-12-31 19:24:19 【问题描述】:

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

这是 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 并更改每个RowBackground 颜色时,此代码有效。问题是当我点击取消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++;

continue Button 的代码除了改变行的背景之外工作。

更新: 取消代码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);
        

【问题讨论】:

您能否完整发布您的代码 - 您的取消和继续按钮代码? 正如我所说的,问题不在取消和继续按钮代码中。因为当我删除代码行以更改背景时,所有工作都有效。取消按钮仅发送取消令牌请求。按照我写的继续:在DB Table 中获取最后一个 ID 的 3 个字符串并使用 foreach 循环调用任务 这不是重点;我无法重现您的问题和/或在没有看到完整情况的情况下尝试找出问题。你的问题一开始就很难理解。 您在Continue 按钮代码的哪个位置调用DataGrid 行颜色更改代码?在 loadGroupsInList() 之后?由于您收到 NullReferenceException,我猜数据网格没有您指定的行号?请调试您的程序并找出哪一行引发了异常。 await TaskPostToGroup(tokenSource.Token, fbGroupID, true); 是执行 foreach 循环的代码的一部分,我有用于更改背景颜色的代码。为了更改背景颜色,我得到 NullReferenceException 。我有 int number 在 foreach 循环结束时递增。 【参考方案1】:

我解决了这个问题。所以问题是因为我再次用数据填充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
  ................

【讨论】:

-1 :这些都没有任何意义。你做的这一切都是错的。学习MVVM;正确地做到这一点,甚至不需要这个问题。更糟糕的是,悬赏你的问题,然后奖励自己实际上没有回答的答案。 我同意 Maverik 的观点,并且在下次发布问题之前阅读此内容:link。它将帮助您获得所需的信息,同时也帮助其他有类似问题的人。这就是 Stack Overflow 的全部意义所在;) @Maverik 我等待答案的时间太长了,但我没有得到它。所以我找到了我的解决方案。好吧,我会学习,但我刚刚开始使用 WPF @Maverik 为数据库中的每个表创建新模型类是一种好习惯吗?所以如果我的数据库中有 5 个表,我需要有 5 个模型类吗? @MiOnls 请加入我们的聊天室,以便正确开始使用 WPF 并获得相关技术建议WPF Chat Room。您的问题不是我可以在 cmets 中回答的问题。但我会说搜索 EntityFrameworkCore 以了解如何正确执行此部分,一旦您掌握了窍门,我们可以在聊天中为您提供更多建议。【参考方案2】:

好的,我想我明白你现在的问题了。它在您自己的代码中:

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 语句中的增量。

【讨论】:

你知道继续做什么吗?我需要那个增量,因为我不能准确地得到Row,其中是循环。我从不在一个循环中增加 number 两次。阅读continue。 我还将.ContainerFromIndex(number); 更改为.ContainerFromItem(group);,它的工作方式与.ContainerFromIndex(number); 相同 -1:我觉得一个 2K 代表的人发布实际上不是答案的双重“答案”真的很奇怪。你是如何在不了解 SO 问答的基本规则的情况下获得代表的?!

以上是关于设置datagrid行背景颜色WPF - 循环[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

wpf datagrid 滚动条如何设置宽度和颜色

WPF使用转换器更改datagrid单元格背景颜色

如何使用 WPF Toolkit Datagrid 更改单元格的背景颜色

如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色

WPF DataGrid根据内容设置行颜色

wpf datagrid 样式怎么设置默认选中行的颜色