使用DataGridView保持当前正在运行的进程列表?

时间:2014-03-12 21:43:53

标签: c# windows datagridview process

我正在尝试在C#中创建类似于任务管理器的程序。我当前的方法是在应用程序启动时获取进程列表,然后在用户按下“更新”按钮时获取新列表。我希望在我的控件中保留一个当前列表,并“保存”用户选择的位置而不是选择并重置滚动条。在C#中这样做的正确方法是什么?

以下是我目前更新控件的方式:

public void UpdateForm()
{
    processGridView.Rows.Clear();
    Process[] processes = Process.GetProcesses();

    for (int i = 0; i < processes.Length; ++i)
    {
        processGridView.Rows.Add();
        processGridView.Rows[i].Cells["processName"].Value = processes[i].ProcessName + ".exe";
        processGridView.Rows[i].Cells["processID"].Value = processes[i].Id;
    }
}

1 个答案:

答案 0 :(得分:0)

您在评论中提到真正的问题在于GridView的刷新。我建议您使用data binding

编辑更多代码。但请阅读有关数据绑定的内容。 Here是有关DataSource属性的msdn页面。请注意,您不需要sql数据库对象,您可以绑定到一个简单的列表。

然后,当您的计时器停止并且您有新数据时,请重置网格视图数据和绑定。我发现重置也会重置滚动条,所以我添加了this question的代码以保持滚动偏移固定。它不是很好,因为鼠标在刷新期间失去了对滚动条的控制。我会让你找到一个更好的解决方案。

public Form1()
{
  InitializeComponent();

  OnRefreshGrid(null, null);
  Timer ticker = new Timer();
  ticker.Interval = 250;
  ticker.Tick += OnRefreshGrid;
  ticker.Start();
}

void OnRefreshGrid(object sender, EventArgs e)
{
  BindingSource source = new BindingSource();
  var table = new DataTable("Process List");

  Process[] processes = Process.GetProcesses();

  table.Columns.Add("Name");
  table.Columns.Add("Id");

  for (int i = 0; i < processes.Length; ++i)
  {
    table.Rows.Add(new object[] { processes[i].ProcessName + ".exe", processes[i].Id });
  } 

  table.AcceptChanges();
  source.DataSource = table;

  int scroll = dataGridView1.FirstDisplayedScrollingRowIndex;
  dataGridView1.DataSource = source;

  if (scroll != -1)
    dataGridView1.FirstDisplayedScrollingRowIndex = scroll;
}