Как правильно реализовать работу с DataGridView?

202
06 ноября 2021, 14:20

Ранее я сразу использовал DataGridView как место для хранения данных - туда записывал и оттуда забирал. Но один хороший человек, подсказал что это неправильно и нужно использовать какой то промежуточное место для хранения, а оттуда уже отображать в DataGridView и т.д. (Если я правильно понял)

Но вот есть такой момент, я подумал - что могу использовать двумерный массив например, но как его привязать к DataGridView и отображать в реальном времени изменённые данные ?

Я заранее знаю сколько у меня будет стобцов / строк и их количество не изменяемое.

Или для этого нужно использовать только List ? Которыми я ещё не овладел xD

UPD: Немного разобрался как работают коллекции и с привязкой к DataGridView Но есть вопрос - каждый раз если я изменил какое то значение в коллекции - мне нужно каждый раз использовать bindingSource.ResetItem ? Или есть что то встроенное ? Типа задал True и само обновляется ? И могут ли быть проблемы с bindingSource.ResetItem если я вызываю его из другого потока ?

    private void ChangeItemVin(int val, string text)
    {
        list[val].Vin = text;
        bindingSource.ResetItem(val);
    }
Answer 1

Простейший пример, будет считать асинхронно числа фибоначчи.

Сначала создадим класс модели, реализующий INotifyPropertyChanged в свойстве, которое будем изменять значение программно будем вызывать событие PropertyChanged с тем, чтоб обновить отображаемое значение в DGV.

class Number : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public int Id { get; private set; }
    public int InputValue { get; private set; }
    private int _OutputValue;
    public int OutputValue
    {
        get => _OutputValue;
        set
        {
            _OutputValue = value;
            //оповещаем, что значение свойства изменилось
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OutputValue)));
        }
    }
    public Number(int id, int value)
    {
        Id = id;
        InputValue = value;
    }
}

Далее код формы. Используем в качестве источника данных для DGV BindingList<T>.

public partial class FormMain : Form
{
    //источник данных для DGV
    private BindingList<Number> _blNumbers;
    public FormMain()
    {
        InitializeComponent();
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Text = "Пример";
        //установки привязок
        SetBindings();
        _button.Click += Button_Click;
        this.Load += FormMain_Load;
    }
    private void SetBindings()
    {
        //инициализируем
        _blNumbers = new BindingList<Number>();
        //выкл.автогенерацию столбцов
        _dataGridView.AutoGenerateColumns = false;
        //привязываем список к DGV
        _dataGridView.DataSource = _blNumbers;
        //привязки к колонкам
        _columnId.DataPropertyName = nameof(Number.Id);
        _columnInput.DataPropertyName = nameof(Number.InputValue);
        _columnOutput.DataPropertyName = nameof(Number.OutputValue);
    }
    private void FormMain_Load(object sender, EventArgs e)
    {
        //получаем числа
        var data = new DataContext();
        var nums = data.GetNumbers();
        //отображаем их
        nums.ForEach(_blNumbers.Add);
    }
    private async void Button_Click(object sender, EventArgs e)
    {
        _button.Enabled = false;
        var fibService = new FibService();
        try
        {
            foreach (Number number in _blNumbers)
            {
                //считаем число фибоначчи
                int result = await fibService.GetFibNumberAsync(number.InputValue);
                //отображаем его
                number.OutputValue = result;
            }
        }
        finally
        {
            _button.Enabled = true;
        }
    }
}

А это, на всякий случай, код подсчета чисел.

class FibService
{
    internal async Task<int> GetFibNumberAsync(int inputValue)
    {
        await Task.Delay(100);
        if (inputValue <= 1) return 1;
        return await GetFibNumberAsync(inputValue - 2) + await GetFibNumberAsync(inputValue - 1);
    }
}
READ ALSO
Поиск значений в json на c#

Поиск значений в json на c#

Мне нужно получать json из веб-сервиса, потом пройтись по нему, чтобы найти определённые значенияОсновной проблемой является то, что json приходит...

92
получение JSON в ajax, php

получение JSON в ajax, php

есть небольшой скрипт поиска сделан на php (работает и получает ответ без подключения ajax)

236
Доступ к сетевой папке из php

Доступ к сетевой папке из php

Нужно получить файлы из сетевой папки через php (web-сервер Apache+php на Windows2008 R2 Enterprise) На самом сервере я могу подключить сетевую папку, все данные...

199