我在让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>
的地方。运行此命令后,我删除了一行(现在有一行),一切正常。该行被删除,基础列表中没有任何内容。但是当我尝试刷新(因此添加新行)时,我得到了:
帽子的第一行是重复的,并水平附加到第一行。重新绑定之前,我对我的st憬是正确的,我们可以看到DataSource
只有一项:
即使在 绑定之后,我也可以检查并看到该数据源中的 1 项仍然存在:
所以我的问题是,为什么DataSource
中只有一项,我可以看到重复的行。旧的DataSource
是否以某种方式“幻影”在其中?这是因为我的出价方式(顺便说一下,我对Winforms不太了解)引起的问题,还是这是框架中的某个错误?