C# 无法使用不同颜色的WPF c向datagrid添加多行#

C# 无法使用不同颜色的WPF c向datagrid添加多行#,c#,wpf,datagrid,nullreferenceexception,C#,Wpf,Datagrid,Nullreferenceexception,我有一个DataGrid,它绑定到JobItems的ObservableCollection。JobItems具有DueDate属性,根据currentDate与DueDate的接近程度,行颜色会相应更改。当用户通过UI向ObservaleCollection添加项时,这非常有效,但当我在代码隐藏中创建多个虚拟JobItem以在程序开始时填充此数据网格时,这不起作用。然而,我添加的第一个虚拟对象没有任何问题。这一点很重要,因为当我的数据库就位时,我最终会需要它 这就是我的代码背后的样子: Obs

我有一个DataGrid,它绑定到JobItems的ObservableCollection。JobItems具有DueDate属性,根据currentDate与DueDate的接近程度,行颜色会相应更改。当用户通过UI向ObservaleCollection添加项时,这非常有效,但当我在代码隐藏中创建多个虚拟JobItem以在程序开始时填充此数据网格时,这不起作用。然而,我添加的第一个虚拟对象没有任何问题。这一点很重要,因为当我的数据库就位时,我最终会需要它

这就是我的代码背后的样子:

ObservableCollection <JobItem> JobItemList = new ObservableCollection<JobItem>();
public AdminView(Employee currEmployee)
    {
        this.Title = "Administrator View - " + currEmployee.Name;
        InitializeComponent();
        jobItemDataGrid.DataContext = JobItemList;

        LoadDummies();


    }

    private void LoadDummies()
    {
        JobItem j1 = new JobItem();
        JobItem j2 = new JobItem();
        JobItem j3 = new JobItem();

        j1.WorkOrderNo = "W12-021";
        j2.WorkOrderNo = "W12-037";
        j3.WorkOrderNo = "W12-234";


        j1.DateReceived = DateTime.Now.ToString();
        j2.DateReceived = DateTime.Now.ToString();
        j3.DateReceived = DateTime.Now.ToString();

        j1.DueDate = (DateTime.Now.AddDays(2)).ToString();
        j2.DueDate = (DateTime.Now.AddDays(2)).ToString();
        j3.DueDate = (DateTime.Now.AddDays(9)).ToString();

        j1.RushPriority = true;

        j1.Status = "Completed";
        j2.Status = "Accepted";  
        j3.Status = "Completed";

        JobItemList.Add(j1);
        JobItemList.Add(j2);
        JobItemList.Add(j3);
    }

    private void newJobBtn_Click(object sender, RoutedEventArgs e)
    {
        NewJobDialog newJobWindow = new NewJobDialog(workOrderCounter);

        newJobWindow.ShowDialog();

        if (newJobWindow.DialogResult == true)
        {
            if (newJobWindow.HasContent && newJobWindow.DialogResult.Value)
            {
                JobItemList.Add(newJobWindow.newJob);
                workOrderCounter++;

            }

        }

    }

    /*Formats each row in the data grid depending on how close the due date of each
     * job is.  Each color corresponds to how close the due date is from today.
     * Blue: Job is due in more than 7 days
     * Green: Job is due between 4-7 days
     * Yellow: Job is due in 0-3 days
     * Red:
     * */
    private void jobItemDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        DateTime currentDate = DateTime.Now;
        DateTime dateValue = new DateTime();
        TimeSpan elapsed;
        Double daysLeft;
        Double enoughTime = 7;
        Double dueSoon = 3;
        Double dueToday = 0;


        foreach (JobItem item in jobItemDataGrid.ItemsSource)
        {

            var row = jobItemDataGrid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
            //subtracting the two dates to get an elapsed amount of days
            if ((DateTime.TryParse(item.DueDate.ToString(),out dateValue) == true))
            {

                //dateValue = DateTime.Parse(item.DueDate.ToString());
                elapsed = dateValue.Subtract(currentDate);
                daysLeft = elapsed.TotalDays;
                //MessageBox.Show("due date: " + dateValue.ToString() + " current date: " + currentDate.ToString() + " days left: " + daysLeft.ToString() + "rounded: "  + daysLeftRound.ToString());

                if (item.RushPriority == true)
                {
                    row.Background = new SolidColorBrush(Colors.Black);
                    row.Foreground = new SolidColorBrush(Colors.White);
                }
                else if (daysLeft > enoughTime)
                {
                    row.Background = new SolidColorBrush(Colors.Blue);
                    row.Foreground = new SolidColorBrush(Colors.White);
                }
                else if (daysLeft <= enoughTime && daysLeft > dueSoon)
                {
                    row.Background = new SolidColorBrush(Colors.Green);
                    row.Foreground = new SolidColorBrush(Colors.White);
                }
                else if (daysLeft <= dueSoon && daysLeft >= dueToday)
                {
                    row.Background = new SolidColorBrush(Colors.Yellow);
                }
                else if (daysLeft < dueToday)
                {
                    row.Background = new SolidColorBrush(Colors.Red);
                    row.Foreground = new SolidColorBrush(Colors.White);
                }

            }

        } 
    }
ObservableCollection作业项列表=新的ObservableCollection();
公共AdminView(员工currEmployee)
{
this.Title=“管理员视图-”+currenemployee.Name;
初始化组件();
jobItemDataGrid.DataContext=JobItemList;
加载假人();
}
私有void LoadDummies()
{
JobItem j1=新JobItem();
JobItem j2=新JobItem();
JobItem j3=新的JobItem();
j1.WorkOrderNo=“W12-021”;
j2.WorkOrderNo=“W12-037”;
j3.WorkOrderNo=“W12-234”;
j1.DateReceived=DateTime.Now.ToString();
j2.DateReceived=DateTime.Now.ToString();
j3.DateReceived=DateTime.Now.ToString();
j1.DueDate=(DateTime.Now.AddDays(2)).ToString();
j2.DueDate=(DateTime.Now.AddDays(2)).ToString();
j3.DueDate=(DateTime.Now.AddDays(9)).ToString();
j1.1优先级=真;
j1.Status=“已完成”;
j2.Status=“已接受”;
j3.Status=“已完成”;
JobItemList.Add(j1);
JobItemList.Add(j2);
JobItemList.Add(j3);
}
私有void newJobBtn_单击(对象发送方,路由目标)
{
NewJobDialog newJobWindow=新建NewJobDialog(workOrderCounter);
newJobWindow.ShowDialog();
if(newJobWindow.DialogResult==true)
{
if(newJobWindow.HasContent&&newJobWindow.DialogResult.Value)
{
JobItemList.Add(newJobWindow.newJob);
workOrderCounter++;
}
}
}
/*根据每一行的截止日期,格式化数据网格中的每一行
*工作是。每种颜色对应于截止日期从今天起的距离。
*蓝色:工作将在7天以上到期
*绿色:工作期限为4-7天
*黄色:作业在0-3天内到期
*红色:
* */
私有void jobItemDataGrid_LoadingRow(对象发送方,DataGridRowEventArgs e)
{
DateTime currentDate=DateTime.Now;
DateTime dateValue=new DateTime();
时间跨度;
双daysLeft;
双倍时间=7;
双倍体=3;
今天双倍=0;
foreach(jobItemDataGrid.ItemsSource中的JobItem项)
{
var row=jobItemDataGrid.ItemContainerGenerator.ContainerFromItem(item)作为DataGridRow;
//减去这两个日期,得到经过的天数
if((DateTime.TryParse(item.DueDate.ToString(),out dateValue)==true))
{
//dateValue=DateTime.Parse(item.DueDate.ToString());
已用=日期值。减去(当前日期);
daysLeft=已用的总天数;
//MessageBox.Show(“截止日期:“+dateValue.ToString()+”当前日期:“+currentDate.ToString()+”剩余天数:“+daysLeft.ToString()+”舍入:“+daysLeftRound.ToString()”);
如果(item.RushPriority==true)
{
row.Background=新的SolidColorBrush(Colors.Black);
row.Foreground=新的SolidColorBrush(Colors.White);
}
否则如果(daysLeft>enoughTime)
{
row.Background=新的SolidColorBrush(Colors.Blue);
row.Foreground=新的SolidColorBrush(Colors.White);
}
否则如果(daysLeft dueSoon)
{
row.Background=新的SolidColorBrush(Colors.Green);
row.Foreground=新的SolidColorBrush(Colors.White);
}
else if(daysLeft=dueToday)
{
row.Background=新的SolidColorBrush(Colors.Yellow);
}
否则如果(daysLeft
I当我从LoadDummies()添加多个虚拟项时,我得到错误: “未处理NullReferenceException。对象引用未设置为对象的实例。”


感谢您的帮助

我想你忘了创建作业项列表。 尝试将其放入构造函数中:

JobItemList = new List<JobItem>();
JobItemList=newlist();

在下面的if语句中,添加一个空签入行

if ((DateTime.TryParse(item.DueDate.ToString(), out dateValue) == true) && row != null) 

实际上,我已经在中添加了它,它就在我编辑上述代码的“public AdminView()”之前。Wat是发生空引用的确切行?空引用发生在行中。背景=新的SolidColorBrush(Colors.Yellow);在这种情况下,是您的行对象为空,因此错误的来源来自以下代码行:var row=jobItemDataGrid.ItemContainerGenerator.containerfromtime(item)as DataGridRow;您可以将XAML发布到声明datagrid和ItemTemplate的部分吗?我相信你的错误的真正根源就在那里。谢谢你的帮助,我实际上是自己发现的!