dataGridview1.refresh не работает, когда привязан к чистой таблице данных (нет базы данных позади) - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть таблица данных, которую я программно связал с 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 только для того, чтобы сделать эту довольно базовую функциональность?Какая польза от метода Refresh для GridView?

Примечание: я могу добавить в простой список без проблем.

Обновление: для контекста я захватываю текст в буфер обмена (эта часть работает, так что нет проблем) и просто положить его в сетку.Я попробовал метод 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 ]

1 голос
/ 01 ноября 2010

На самом деле, поскольку таблица данных связана с вашим представлением таблицы данных, все изменения в таблице данных должны немедленно появиться в таблице данных.

Что может быть причиной того, что ваше представление не обновляется, то, что вы делаетеизменяется на datatable в потоке, отличном от потока пользовательского интерфейса.

Вам нужно вызвать что-то вроде

dataGridView1.Invoke(new DelRefresh(Refresh));

с

public delegate void DelRefresh();

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

, чтодолжно заставить это работать.

1 голос
/ 01 ноября 2010

UPDATE

Вы хотите добавить

datatTable.add(dataRow);

после установки свойства name или строки не добавляются в таблицу.

NewRow только создает объект строки, соответствующий таблице, но не добавляет его в таблицу.

0 голосов
/ 01 ноября 2010

try

Вместо

dataGridView1.Refresh();

try

dataGridView1.DataSource = dataTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...