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 已经有三列,通过 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()很重要,不是吗?使用此代码,表单加载如下:

显示问题的示例

请注意,即使使用方法单击刷新按钮RefreshDgvContacts_WithIssue()也可以正常工作。

但是现在我们知道我们最好使用第一个示例,即RefreshDgvContacts()加载DataGridView。

于 2012-07-17T11:50:20.033 回答
0

将数据放入 a 的最简单方法DataGridView是使用 DataSource,然后将数据添加到该 DataSource。

确切的细节很大程度上取决于您要做什么 - 有很多不同的方法,但下面是一个使用 aBindingSource作为网格数据源的简单示例。

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 回答