アレックス、コードからわかるように、バインドされていないDataGridViewを使用していて、問題を再現して解決することができました。
この例のDataGridViewには、Visual Studioデザイナーを介して追加された3つの列が既にあります(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();
}
私の例では、contactsListは次のように定義されていることに注意してください(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()
が重要だというのは意外ですね。このコードを使用すると、フォームは次のように読み込まれます。
[更新]ボタンをクリックしても、メソッドを使用しても正常に機能することに注意RefreshDgvContacts_WithIssue()
してください。
しかし、今では、最初の例、つまりRefreshDgvContacts()
DataGridViewをロードする方がよいことを学びました。