我正在尝试在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;
}
}
答案 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;
}