DataGridView не обновляется немедленно (необходимо выбрать ячейку) - PullRequest
0 голосов
/ 31 марта 2020

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

Я узнал, что вы должны использовать BindList obj вместо обычного List , чтобы DataGridView немедленно отображал вам обновленный список.

Но он не выполняет свою работу. Я должен ждать, как 5 ~ 10 SE c, чтобы увидеть DataGridView для обновления. Однако всякий раз, когда я нажимаю на ячейку, она обновляется немедленно. Это то, что я хочу, за исключением того, что я хочу сделать это, не щелкая ячейку.

Поэтому я проверил, занимает ли код для добавления элемента в список больше времени, чем я думал. но это было не так.

public class Data
        {
            public string code { get; set; }
            public int amount { get; set; }
        }
BindingList<Data> DataList = new BindingList<Data>();


stopwatch.Start();
// codeId and size are live streaming data that come in every second
// Update if codeId is not in DataList else make new element and add to DataList
var obj = DataList.FirstOrDefault(x => x.code == codeId);
if (obj != null) obj.program = size;
else
{
var dataElement = new Data { code = codeId, amount = size };
DataList.Add(dataElement);
// dataGridView.Update(); //did not work
// dataGridView.Refresh(); //did not work.
}
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed); //take only milliseconds

Итак, как сделать DataGridView для немедленного обновления?

1 Ответ

3 голосов
/ 31 марта 2020

Ваша модель должна реализовать INotifyPropertyChanged. BindingList автоматически обновит DataGridView новыми записями, но требует, чтобы сама модель полностью реализовала интерфейс INotifyPropertyChanged ( source ). Например:

public class Data : INotifyPropertyChanged
{
    private string code, size;

    public string Code
    {
        get => code;
        set { code = value; OnPropertyChanged(); }
    }

    public string Size
    {
        get => size;
        set { size = value; OnPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

Я создал простое приложение WinForms для проверки этого: Picture of WinForms window in designer

С кодом поддержки, например:

public partial class Form1 : Form
{
    private readonly BindingList<Data> dataList;

    public Form1()
    {
        InitializeComponent();

        dataList = new BindingList<Data>
        {
            new Data { Code = "1", Size = "100" },
            new Data { Code = "2", Size = "200" },
        };

        dataGridView.DataSource = dataList;
    }

    private void AddBtn_Click(object sender, EventArgs e)
    {
        var data = dataList.FirstOrDefault(x => x.Code == CodeTxtBox.Text);

        if (data != null)
        {
            data.Size = SizeTxtBox.Text;
        }
        else
        {
            data = new Data
            {
                Code = CodeTxtBox.Text,
                Size = SizeTxtBox.Text,
            };

            dataList.Add(data);
        }
    }
}

Который мгновенно обновляет DataGridView.

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