如何在WPF中刷新/重新加载datagrid?

时间:2011-08-27 15:13:49

标签: c# .net wpf xaml

我想实现一个datagrid,每5分钟就会填充一次。

但是,第一个代码: XAML:

    <Window.Resources>
    <ObjectDataProvider x:Key="_employeeProvider" ObjectType="{x:Type Brw1:EmployeeDataProvider}" />
    <ObjectDataProvider x:Key="_employeeFactory" ObjectInstance="{StaticResource _employeeProvider}" MethodName="GetEmployees" />
</Window.Resources>

<Grid DataContext="{Binding Source={StaticResource _employeeFactory}}">
    <DataGrid Name="_employeeDataGrid" DockPanel.Dock="Top" Margin="12,57,12,0" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="True">
    </DataGrid>
</Grid>

C#:

    public class EmployeeDataProvider
{
    public ObservableEmployee GetEmployees()
    {
        // This is only example
        // In my project right here I will get data from database, put into the list, and fill datagrid with it. 
        List<UIEmployee> list = new List<UIEmployee>
                {
                    new UIEmployee { Id = 1, FirstName = "Prajeesh2", LastName = "Prathap", Occupation = "Engineer", DateOfJoining=new DateTime(2005, 8, 1), IsContracter = false, AddressInfo = null },
                    new UIEmployee { Id = 2, FirstName = "Rahul2", LastName = "Bose", Occupation = "Student", DateOfJoining=new DateTime(2009, 5, 4), IsContracter = true, AddressInfo = null },
                    new UIEmployee { Id = 3, FirstName = "Steve2", LastName = "Roberts", Occupation = "Manager", DateOfJoining=new DateTime(1994, 8, 23), IsContracter = false, AddressInfo = null },
                    new UIEmployee { Id = 4, FirstName = "Micheal2", LastName = "Clarke", Occupation = "Engineer", DateOfJoining=new DateTime(2003, 1, 14), IsContracter = true, AddressInfo = null },
                    new UIEmployee { Id = 5, FirstName = "Rachel2", LastName = "Green", Occupation = "Professional", DateOfJoining=new DateTime(2006, 3, 8), IsContracter = true, AddressInfo = null }
                };

        ObservableEmployee employeeCollection = new ObservableEmployee(list);
        return employeeCollection;
    }
}

很简单。 Datagrid使用GetEmployees()方法获取数据。

我尝试做的是每隔5分钟运行GetEmployess ..

PS。 _employeeDataGrid.Items.Refresh(); - 不起作用。

更新:

缺课:

    public class ObservableEmployee : ObservableCollection<UIEmployee>
{
    public ObservableEmployee(IEnumerable<UIEmployee> employees) : base(employees) { }
}

public class UIEmployee// : INotifyPropertyChanged
{
    private int m_Id;
    public int Id
    {
        get { return m_Id; }
        set
        {
            m_Id = value;
        }
    }

    private string m_FirstName;
    public string FirstName
    {
        get { return m_FirstName; }
        set
        {
            m_FirstName = value;
        }
    }

    private string m_LastName;
    public string LastName
    {
        get { return m_LastName; }
        set
        {
            m_LastName = value;
        }
    }

    private string m_Occupation;
    public string Occupation
    {
        get { return m_Occupation; }
        set
        {
            m_Occupation = value;
        }
    }

    private DateTime m_DateOfJoining;
    public DateTime DateOfJoining
    {
        get { return m_DateOfJoining; }
        set
        {
            m_DateOfJoining = value;
        }
    }

    private bool m_IsContracter;
    public bool IsContracter
    {
        get { return m_IsContracter; }
        set
        {
            m_IsContracter = value;
        }
    }

}

UPDATE2: 我需要一些东西,它会重新加载datagrid,因此datagrid将不得不再次使用GetEmployees方法。

UPDATE3:

public class TaskDataProvider
{
    static ObservableEmployee list = new ObservableEmployee();
    static DataRepository dr = new DataRepository();

    public static ObservableEmployee GetEmployees()
    {
        UpdateMyList();
        return list;
    }

    public static void UpdateMyList() 
    {
        ObservableTask newList = new ObservableTask(dr.GetTasks());

        list.Clear();
        foreach (Task t in newList)
        {
            list.Add(t);
        }
    }
}

这一开始有效。 但是,我在数据库中更改,然后单击按钮:

TaskDataProvider.UpdateMyList();

在断点时,它获得了正确的数据(新数据) - 但是,datagrid没有刷新:/

3 个答案:

答案 0 :(得分:9)

dataGrid.Items.refresh();

更新DataGrid的内容

答案 1 :(得分:5)

或者,您可以将ItemsSource空出来并再次初始化它:

dataGridView.ItemsSource = null;
dataGridView.ItemsSource = ItemsSourceObjects;

答案 2 :(得分:1)

我猜这个原因绑定并不知道你改变了收藏。 我建议,或者:

  • 清除并在使用新数据填充之前绑定到网格的集合之后(与GetEmployees()相同的集合,每次创建一个新数据。

  • 在分配新集合之前尝试以分配给DataContext null或空集合,并在实际分配新集合之后。

修改

 ObservableEmployee <UIEmployee> list = new ObservableEmployee <UIEmployee>(); //move list to global variables and declare it as ObservableCollection
 public ObservableEmployee GetEmployees()
    {

       //here only return an instance of list
       return list;

    }

//this method call when you want to update data on gri
public void UpdateMyList() {

     //clear list 
     list.Clear();

     //after add all data
     list.Ad(..);
     list(..); 
     .
     .

}