使用任务方法为每个任务/行更新datagrid / listview中的行

时间:2017-03-27 10:13:36

标签: c# listview datagridview datagrid

我已经问了几次这个问题,但从来没有设法找到它的底部。希望有人可以帮助我,因为我是编程和C#的新手。

我有一个按钮,会将Tasks添加到Task<List>,然后使用DatagridTask ID等一些值填充Task Status(以前的Listview) Task。我添加的每个method都包含相同 Status,应该更新Task index的相关namespace Something { public class listView { private static ObservableCollection<listItems> _myList = new ObservableCollection<listItems>(); public static ObservableCollection<listItems> myList { get { return _myList; } } private static string _status; public class listItems : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public int id { get; set; } public string status { get { return _status; } set { if (_status != value) { _status = value; OnPropertyChanged(); } } } } }

请参阅下文。

我的列表视图:

public MainWindow()
    {
        InitializeComponent();
        dataGrid.ItemsSource = listView.myList;
    }

  private void create_btn_Click(object sender, RoutedEventArgs e)
    {
        lvl.status = "Task ready to start";

        var repeat = int.Parse(taskNumber.Text);
        addTasks(repeat);

        run_btn.IsEnabled = true;
        create_btn.IsEnabled = false;
        taskNumber.IsEnabled = false;
    }

    private void run_btn_Click(object sender, RoutedEventArgs e)
    {
        foreach (var Task in myTasks)
        {
            Task.Start();
        }
    }

    public void addTasks(int repeatCount)
    { 
        List<Task> myTasks = pTask.tasks();
        for (int i = 0; i < repeatCount; i++)
        {
            lvl.id++;
            int x = lvl.id;
            myTasks.Add(new Task(() => p.myAction(x)));
            listView.myList.Add(new listView.listItems
            {
                id = lvl.id,
                status = lvl.status,
            });
        }
    }

我的mainWindow.xaml.cs

method

然后在我的updateStatus调用STATUS来查找要更新的行 public static Action<int> myAction = x => doMethod(x); public static void doMethod(int rowIndex) { updateStatus(rowIndex, "testing"); } public static void updateStatus(int row, string text) { listView.myList[row].status = text; }

value

我怀疑这不起作用,因为传递到X的{​​{1}}每次iteration都会更新,导致datagrid中的最后一行更新?

请有人可以为我提供替代方案,让task method的每个row index更新与task index匹配吗?

谢谢

PS:请放轻松我,因为我自学了一个非常新的编程/ C#...

1 个答案:

答案 0 :(得分:0)

listView课程中,您有private static string _status;

因此,每个列表项都可以访问此静态字段,而OnPropertyChanged只发生一次(请参阅if (_status != value)status内查看}

因此,请尝试将私有字段private string _status;添加到listItems