代码之家  ›  专栏  ›  技术社区  ›  user310291

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

  •  0
  • user310291  · 技术社区  · 14 年前

    我有一个以编程方式绑定到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 回复  |  直到 14 年前
        1
  •  1
  •   David Mårtensson    14 年前

    UPDATE

    你需要补充

    datatTable.add(dataRow);
    

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

        2
  •  1
  •   Qiong Wu    14 年前

    实际上,由于datatable绑定到datagridview,对datatable的所有更改都应该立即出现在datagridview中。

    你需要做的是

    dataGridView1.Invoke(new DelRefresh(Refresh));
    

    具有

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

        3
  •  0
  •   clyc    14 年前

    尝试

    dataGridView1.Refresh();
    

    dataGridView1.DataSource = dataTable