У меня небольшая проблема с настройкой DataGridView
для правильной работы. В настоящее время у меня есть DataSource
для привязки моих данных (в данном случае List<T>
объектов) и следующий метод для привязки данных к элементу управления:
private void Bind(List<CAMPDomainLayer.FeeDefinition> fees)
{
BindingSource bs = new BindingSource(fees, null);
dgvFees.AutoGenerateColumns = false;
var colDesc = new DataGridViewTextBoxColumn
{
HeaderText = "Description",
DataPropertyName = "Description",
ReadOnly = true,
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader
};
var colAmount = new DataGridViewTextBoxColumn
{
HeaderText = "Amount",
DataPropertyName = "FeeAmount",
ReadOnly = false,
};
var colDelete = new DataGridViewButtonColumn
{
HeaderText = string.Empty,
Text = "Delete",
};
dgvFees.Columns.AddRange(new DataGridViewColumn[] { colDesc, colAmount, colDelete });
dgvFees.DataSource = bs;
}
Обратите внимание, что я добавляю столбец кнопки для кнопки удаления, в настоящее время я обрабатываю это со следующим событием:
private void dgvFees_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if(dgvFees.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
{
int index = e.RowIndex;
dgvFees.Rows.RemoveAt(index);
dgvFees.Refresh();
CalculateTotal(Fees, PaymentAmount);
}
}
Кажется, это работает нормально. Строка dgvFees.Rows.RemoveAt(index);
удаляет строку из элемента управления и элемент из базового List<T>
. Проблема возникает, если я пытаюсь добавить новую строку. Прямо сейчас у меня есть кнопка обновления, которая захватывает список с сервера и выполняет повторную привязку, используя вышеуказанный метод Bind()
. Код для этого:
Fees = fees;
Bind(Fees);
Где Fees
это просто List<T>
. Когда это выполняется, и я удаляю строку (прямо сейчас), все работает отлично. Строка удаляется, и в нижележащем списке ничего нет. Но когда я пытаюсь обновить (следовательно, добавляя новые строки), я получаю это:
Первый ряд шляпы дублируется и добавляется по горизонтали к первому ряду. То, что меня раздражает, правильное до того, как мы перепривязываем, мы видим, что DataSource
имеет только один элемент:
Даже после привязки я могу проверить и убедиться, что в этом источнике данных есть элемент 1 :
Итак, мой вопрос: почему, если в DataSource
есть только один элемент, я могу увидеть дублирующую строку. Старый DataSource
как-то "фантомен" там? Является ли это проблемой из-за моего подхода к ожиданию (по общему признанию, я не знаю много о Winforms), или это какая-то ошибка в структуре?