dataGridview1.refresh在绑定到纯dataTable时不起作用(后面没有数据库)

时间:2010-11-01 14:38:25

标签: c# winforms

我有一个数据表,我以编程方式绑定到dataGridview1

    public Form1()
    {
        InitializeComponent();
        dataTable = new DataTable();            
        dataTable.Columns.Add("name");

        this.dataGridView1.DataSource = dataTable;

然后在某个事件处理程序中,我在dataTable中添加了新行并执行了无效的刷新:grid保持空白!

        DataRow dataRow = dataTable.NewRow();
        dataRow["name"] = "John";

        dataGridView1.Refresh();

我在这里阅读http://objectmix.com/dotnet/92001-datagridview-doesnt-refresh.html以使用RaiseListChangedEvents但是我看不到如何,因为我没有看到任何绑定源。

我是否有义务使用另一个控件BindingSource来做这个非常基本的功能?那么GridView的Refresh方法有什么用?

注意:我可以添加到一个没有问题的简单列表。

更新:对于上下文,我正在捕捉剪贴板中的文本(该部分工作没有问题)并将其放入网格中。我按照建议尝试了invoke方法,但它仍然不起作用:

public partial class Form1 : Form
{
    public delegate void DelRefresh();


    private ClipboardSpy cps;
    private DataTable dataTable;

    public override void Refresh()
    {
        dataGridView1.DataSource = dataTable;
    }

    public Main()
    {
        InitializeComponent();

        cps = new ClipboardSpy(this);
        cps.ClipboardChanged += new EventHandler(cps_ClipboardChanged);

        dataTable = new DataTable();            
        dataTable.Columns.Add("Url");

        this.dataGridView1.DataSource = dataTable;


    }

    void cps_ClipboardChanged(object sender, EventArgs e)
    {
        String clipboardText = cps.GetClipboardData();
        DataRow dataRow = dataTable.NewRow();
        dataRow["Url"] = clipboardText;


        dataGridView1.Invoke(new DelRefresh(Refresh));


        //listBox1.Items.Add(string.Format("{0:HH:mm:ss} " + clipboardText, DateTime.Now));
        //listBox1.SelectedIndex = listBox1.Items.Count - 1;
    }

}

3 个答案:

答案 0 :(得分:1)

UPDATE

您需要添加

datatTable.add(dataRow);

设置name属性后,或者行未添加到表中。

NewRow只创建一个与表匹配的行对象,它不会将它添加到表中。

答案 1 :(得分:1)

实际上,因为数据表绑定到datagridview,所以对数据表的所有更改都应该立即出现在datagridview中。

您的视图未更新的原因可能是您在与UI线程不同的线程中对数据表进行了更改。

你需要做的是,打电话给

dataGridView1.Invoke(new DelRefresh(Refresh));

public delegate void DelRefresh();

public void Refresh()
{
      dataGridView1.DataSource = dataTable
}

应该让它发挥作用。

答案 2 :(得分:0)

尝试

而不是

dataGridView1.Refresh();

尝试

dataGridView1.DataSource = dataTable