Ранее я сразу использовал 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);
}
Простейший пример, будет считать асинхронно числа фибоначчи.
Сначала создадим класс модели, реализующий 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);
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне нужно получать json из веб-сервиса, потом пройтись по нему, чтобы найти определённые значенияОсновной проблемой является то, что json приходит...
есть небольшой скрипт поиска сделан на php (работает и получает ответ без подключения ajax)
Нужно получить файлы из сетевой папки через php (web-сервер Apache+php на Windows2008 R2 Enterprise) На самом сервере я могу подключить сетевую папку, все данные...