我有一个数据表,我以编程方式绑定到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;
}
}
答案 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