亚历克斯,您使用的是未绑定的 DataGridView,正如我从您的代码中看到的那样,我能够重现该问题并解决它:
![数据网格视图示例](https://i.stack.imgur.com/7lsqo.gif)
此示例中的 DataGridView 已经有三列,通过 Visual Studio 设计器添加(右键单击 DataGridView 的三角形,随后添加 3 列,如上面的屏幕截图所示)。这是下面示例的先决条件。
看一下这段代码(我去掉了一些地址字段以使其更短,并命名 DataGridView 以dgvContactsList
将其与列表区分开来contactsList
):
private void RefreshDgvContacts()
{
if (contactsList.Count > dgvContactsList.Rows.Count)
dgvContactsList.Rows.Add(
contactsList.Count - dgvContactsList.Rows.Count
);
int i = 0;
foreach (Contact c in contactsList)
{
dgvContactsList.Rows[i].Cells[0].Value = c.Firstname;
dgvContactsList.Rows[i].Cells[1].Value = c.Surname;
dgvContactsList.Rows[i].Cells[2].Value = c.Address;
i++;
}
}
在以下事件中调用此方法:
private void btnRefresh_Click(object sender, EventArgs e)
{
RefreshDgvContacts();
}
private void Form1_Load(object sender, EventArgs e)
{
RefreshDgvContacts();
}
请注意,在我的示例中,contactList 定义如下(它在包含 DataGridView 的表单类中声明):
public List<Contact> contactsList = new List<Contact>()
{ new Contact() {Firstname="Mark", Surname="Hamill",
Address="Hollywood"},
new Contact() {Firstname="Harrison", Surname="Ford",
Address="Hollywood"}
};
public class Contact
{
[DataObjectField(false)]
public string Firstname { get; set; }
[DataObjectField(false)]
public string Surname { get; set; }
[DataObjectField(false)]
public string Address { get; set; }
}
该示例中重要的是在更改值之前根据需要创建所有行。请注意,您可以RefreshDgvContact
多次调用该方法(例如,从刷新按钮)并且它仍然有效,因为只有在行不存在时才会添加行。
同样重要的是,如果您正在填充此处所示的 DataGridView,则它不能同时绑定到数据源。如果您打算绑定数据源,请查看 David 已经发布的另一个示例。
但是,我认为拥有这两个示例很重要,因为有时不绑定数据源很有用,有时绑定的数据源更方便。
对于那些想要重现问题的人,您可以通过以下方法替换工作方法RefreshDgvContacts
(不要忘记更改事件):Form1_Load()
btnRefresh_Click()
private void RefreshDgvContacts_WithIssue()
{ // this sample leaves the 1st row blank called in Form1_Load
// 2nd and subsequent calls, e.g. from the Refresh button don't show
// the issue.
int i = 0;
foreach (Contact c in contactsList)
{
if (i >= dgvContactsList.Rows.Count)
dgvContactsList.Rows.Add();
dgvContactsList.Rows[i].Cells[0].Value = c.Firstname;
dgvContactsList.Rows[i].Cells[1].Value = c.Surname;
dgvContactsList.Rows[i].Cells[2].Value = c.Address;
i++;
}
}
令人惊讶的是, 的位置dgvContactsList.Rows.Add()
很重要,不是吗?使用此代码,表单加载如下:
![显示问题的示例](https://i.stack.imgur.com/KmpbE.gif)
请注意,即使使用方法单击刷新按钮RefreshDgvContacts_WithIssue()
也可以正常工作。
但是现在我们知道我们最好使用第一个示例,即RefreshDgvContacts()
加载DataGridView。