设置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);
}
我解决了这个问题。所以问题是因为我用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
................
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
语句中的增量。
你知道继续做什么吗?我需要这个增量,因为我无法确切地得到'Row',其中是循环的瞬间。我从来没有在一个循环中增加两次'号码'。阅读有关[继续](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/continue)。 – MiOnIs
我也将'.ContainerFromIndex(number);'改为'.ContainerFromItem(group);',它的工作方式与'.ContainerFromIndex(number);' – MiOnIs
-1:我觉得对于2K代表来说真的很奇怪人发布双重“答案”,这些答案实际上并不是答案。如何在不了解SO的基本Q&A规则的情况下耙出代表? – Maverik
你能发布您的代码完全 - 无论你的取消并继续按钮的代码? – Sach
正如我所说问题不在取消和继续按钮代码。因为当我删除用于更改背景的代码行时,所有工作都会发生取消按钮只发送取消令牌请求。继续我写道:获取'DB Table'中最后一个ID的3个字符串并用foreach循环调用任务 – MiOnIs
这不是重点;我无法重现您的问题,并且/或者在没有看到完整图片的情况下尝试找出问题。您的问题首先难以理解。 – Sach