C# DGV仅在单击单元格时更新

C# DGV仅在单击单元格时更新,c#,winforms,datasource,C#,Winforms,Datasource,我有一份WFA,目前有两份表格 第一个表单包含一个DataGridView,其数据源是一个列表。 当用户单击一个按钮时,就会打开form2。在form2中,我有一个bubblesort算法,它根据列表的一个属性对列表进行排序。然后,它将更新列表传递回form1,并将新数据源设置为来自form2的bubbledsorted更新列表 现在这项工作,泡泡运动的工作。但是,除非单击DGV的各个行/单元格,否则form1上的DGV不会更新。我必须分别点击每一个按钮,让它们处于新的排序位置 以下是我的代码:

我有一份WFA,目前有两份表格

第一个表单包含一个DataGridView,其数据源是一个列表。 当用户单击一个按钮时,就会打开form2。在form2中,我有一个bubblesort算法,它根据列表的一个属性对列表进行排序。然后,它将更新列表传递回form1,并将新数据源设置为来自form2的bubbledsorted更新列表

现在这项工作,泡泡运动的工作。但是,除非单击DGV的各个行/单元格,否则form1上的DGV不会更新。我必须分别点击每一个按钮,让它们处于新的排序位置

以下是我的代码:

表格1:

//This just shows Form2
private void sortByPriority_Click(object sender, EventArgs e)
    {
        fm2 = new Form2();
        fm2.Show();
    }
    //This is called by form2 to set the new datasource
    public  void refreshDataGrid(DataGridView p)
    {

        dataGridView1.DataSource = null;
        dataGridView1.DataSource = p.DataSource;
    }
表格2:

private void sortPriority_Click(object sender, EventArgs e)
    {
        int temp = 0;
        bool tempforComp;
        string tempforDate = "";
        string tempforDesc = "";
        string tempforName = "";
        for (int write = 0; write < 10; write++)
        {
            for (int sort = 0; sort < toDoGen.task.Count - 1; sort++)
            {
                if (toDoGen.task[sort].Priority > toDoGen.task[sort + 1].Priority)
                {
                    temp = toDoGen.task[sort + 1].Priority;
                    tempforComp = toDoGen.task[sort + 1].Completed;
                    tempforDate = toDoGen.task[sort + 1].DateOfCompletion;
                    tempforDesc = toDoGen.task[sort + 1].Description;
                    tempforName = toDoGen.task[sort + 1].Name;

                    toDoGen.task[sort + 1].Priority = toDoGen.task[sort].Priority;
                    toDoGen.task[sort + 1].Completed = toDoGen.task[sort].Completed;
                    toDoGen.task[sort + 1].DateOfCompletion = toDoGen.task[sort].DateOfCompletion;
                    toDoGen.task[sort + 1].Description = toDoGen.task[sort].Description;
                    toDoGen.task[sort + 1].Name = toDoGen.task[sort].Name;

                    toDoGen.task[sort].Priority = temp;
                    toDoGen.task[sort].Completed = tempforComp;
                    toDoGen.task[sort].DateOfCompletion = tempforDate;
                    toDoGen.task[sort].Description = tempforDesc;
                    toDoGen.task[sort].Name = tempforName;

                }
            }
            DataGrid n = new DataGrid();
            n.DataSource = toDoGen.task;
            refresh();
        }
    }
    private void refresh()
    {
        fm1 = new Form1();
        fm1.refreshDataGrid(n);
    }
private void排序优先级\u单击(对象发送方,事件参数e)
{
内部温度=0;
布尔临时公司;
字符串tempforde=“”;
字符串tempforDesc=“”;
字符串tempforName=“”;
for(int write=0;write<10;write++)
{
for(int sort=0;sorttoDoGen.task[sort+1].Priority)
{
temp=toDoGen.task[sort+1]。优先级;
tempforComp=toDoGen.task[sort+1]。已完成;
tempforDate=toDoGen.task[sort+1]。完成日期;
tempforDesc=toDoGen.task[sort+1]。说明;
tempforName=toDoGen.task[sort+1].Name;
toDoGen.task[sort+1]。优先级=toDoGen.task[sort]。优先级;
toDoGen.task[sort+1]。已完成=toDoGen.task[sort]。已完成;
toDoGen.task[sort+1]。完成日期=toDoGen.task[sort]。完成日期;
toDoGen.task[sort+1]。Description=toDoGen.task[sort]。Description;
toDoGen.task[sort+1]。Name=toDoGen.task[sort]。Name;
toDoGen.task[sort].Priority=temp;
toDoGen.task[sort].Completed=tempforComp;
任务[sort].DateOfCompletion=tempforDate;
toDoGen.task[sort].Description=tempforDesc;
toDoGen.task[sort].Name=tempforName;
}
}
DataGrid n=新的DataGrid();
n、 DataSource=toDoGen.task;
刷新();
}
}
私有无效刷新()
{
fm1=新的Form1();
fm1.刷新数据网格(n);
}

编辑:已更新,只是为了澄清-我需要使用多个表单(大学作业),尽管如此,即使在我使用表单1中的排序算法时,它也没有更新。

我将给出一个不使用BubbleSort算法的简化示例,我希望它能有所帮助:

这是Form1类的代码。我之所以定义StringValue类是因为:

公共类字符串值
{
公共字符串值(字符串s)
{
_值=s;
}
公共字符串值{get{return{u Value;}set{{u Value=Value;}}
字符串_值;
}
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
dataGridView1.DataSource=新列表{
新StringValue(“string1”),
新StringValue(“string3”),
新StringValue(“string2”)
};
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Form2 Form2=新的Form2(这是dataGridView1.DataSource作为列表);
表2.Show();
}
公共网格(列表源)
{
dataGridView1.DataSource=源;
}
}
按钮点击事件打开Form2并将网格视图数据源传递给它。这是表格2:

public partial class Form2 : Form
{
    Form1 _form1;
    List<StringValue> _source;

    public Form2(Form1 form1, List<StringValue> source)
    {
        _form1=form1;
        _source=source;
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _source = _source.OrderBy(x => x.Value).ToList();
        _form1.RefreshGrid(_source);
        this.Close();
    }
}
公共部分类表单2:表单
{
表格一(表格一);;
列出来源;
公共表格2(表格1表格1,列表来源)
{
_form1=form1;
_来源=来源;
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
_source=_source.OrderBy(x=>x.Value.ToList();
_格式1.刷新网格(_源);
这个。关闭();
}
}

单击Form2中的按钮后,DataGridView1的数据源将以排序版本刷新,Form2将关闭。

为什么要在refreshDataGrid方法中实例化新Form1?您还没有可用的实例吗?为什么只需要一个新表单来运行排序算法?您可以将它放在Form1中定义的函数中。实际上,它很混乱。我只是想看看它们是否管用。我稍后会把它们清理干净。保罗:哎呀,你说得对,我现在改了。仍然无法回答设置新数据源时为什么不更新。@PaoloCosta大学作业。需要使用多个表单。为什么被否决。。目前没有人试图帮助,只是批评。
public partial class Form2 : Form
{
    Form1 _form1;
    List<StringValue> _source;

    public Form2(Form1 form1, List<StringValue> source)
    {
        _form1=form1;
        _source=source;
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _source = _source.OrderBy(x => x.Value).ToList();
        _form1.RefreshGrid(_source);
        this.Close();
    }
}