1

現在、データグリッドビューに情報を入力しようとしていますが、それをしようとすると、ユーザーがセルを選択した場合、その後値がなくなり、refreshedit(); を使用してこれを修正しました。ただし、これは最後の行のみが最後に書き込まれたことを意味します

これが現時点でのコードです

        foreach ( Contact c in currentBook.Contacts )
        {

            ContactsList.RowCount = i + 1;
            ContactsList.Rows[ i ].Cells[ 1 ].Value = c.FirstName;
            ContactsList.Rows[ i ].Cells[ 2 ].Value = c.Surname;
            ContactsList.Rows[ i ].Cells[ 3 ].Value = c.Address;
            ContactsList.Rows[ i ].Cells[ 4 ].Value = c.Town;
            ContactsList.Rows[ i ].Cells[ 5 ].Value = c.County;
            ContactsList.Rows[ i ].Cells[ 6 ].Value = c.Postcode;
            ContactsList.Rows[ i ].Cells[ 7 ].Value = c.PhoneNum;
            ContactsList.Rows[ i ].Cells[ 8 ].Value = c.Email;
            i++;

        }

このコードは、「プログラムがセル値の変更をコミットまたは終了できないため、操作は成功しませんでした」という例外を受け取ります。

だから私は

ContactsList.RefreshEdit();

i をインクリメントした後、ただし、これは最後の行のみが表示されることを意味します

どんな助けにも感謝します

ありがとう

4

2 に答える 2

1

アレックス、コードからわかるように、バインドされていないDataGridViewを使用していて、問題を再現して解決することができました。

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をロードする方がよいことを学びました。

于 2012-07-17T11:50:20.033 に答える
0

にデータを取得する最も簡単な方法DataGridViewは、DataSource を使用してから、その DataSource にデータを追加することです。

正確な詳細は、何をしようとしているのかによって大きく異なります。さまざまなアプローチがありBindingSourceますが、グリッドのデータソースとして を使用した簡単な例を以下に示します。

BindingSource bs = new BindingSource();  

public Form1()
{
    InitializeComponent();

    dataGridView1.DataSource = bs; 
}

次に、新しい連絡先を追加する場合:

foreach (Contact c in currentBook.Contacts)
{
    bs.Add(c);
}

通常、 currentBook.Contacts を DataSource としてグリッドに直接バインドできるはずですが、それがあなたの状況で機能するかどうかは完全には明らかではありません。

詳細については、データバインディングと DataGridView を参照してください。この MSDN 記事は、開始するのに適した場所です: DataGridView コントロールの概要

于 2012-07-16T20:37:10.320 に答える