设置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
并更改每个Row
的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++;
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 Toolkit Datagrid 更改单元格的背景颜色