DGV仅在单击单元格时更新

时间:2015-04-25 17:05:08

标签: c# winforms datasource

我有一个WFA,目前有2个表格。

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

现在这个工作,bubblesort工作。但是,form1上的DGV不会更新,除非我点击DGV的各个行/单元格。我必须单独点击每一个,以便他们处于新的排序位置。

这是我的代码:

FORM1:

//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;
    }

FORM2:

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);
    }

编辑:更新并且要明确 - 我需要使用多种形式(大学作业),尽管如此,即使我在Form1中使用了排序算法,它也没有更新。

1 个答案:

答案 0 :(得分:0)

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

这是Form1类的代码。我定义了一个StringValue类:How to bind a List<string> to a DataGridView control?

public class StringValue
{
    public StringValue(string s)
    {
        _value = s;
    }
    public string Value { get { return _value; } set { _value = value; } }
    string _value;
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = new List<StringValue> { 
           new StringValue("string1"), 
           new StringValue("string3"), 
           new StringValue("string2") 
        };
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2(this, dataGridView1.DataSource as List<StringValue>);
        form2.Show();
    }

    public void RefreshGrid(List<StringValue> source)
    {
        dataGridView1.DataSource = source;
    }
}

按钮单击事件打开Form2并将网格视图数据源传递给它。这是Form2:

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();
    }
}

单击Form2中的按钮后,DataGridView1的数据源将使用已排序的版本进行刷新,并且Form2将关闭。