c #datagridview将前一行留空

时间:2012-07-16 12:44:54

标签: c# winforms datagridview rows cells

我目前正在尝试将信息输入到数据网格视图中,但是当我尝试这样做时,如果用户选择了一个单元格,之后将没有值,我使用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后

但这意味着只显示最后一行

我会感激任何帮助

感谢

2 个答案:

答案 0 :(得分:1)

Alex,您正在使用未绑定的DataGridView ,因为我可以从您的代码中看到,我能够重现该问题并解决它:

DataGridView example

此示例中的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();
    }

请注意,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()的位置很重要,不是吗?使用此代码,表单加载如下:

Example showing issue

注意即使使用方法RefreshDgvContacts_WithIssue(),点击刷新按钮也能正常工作。

但是现在我们已经了解到我们最好使用第一个示例,即RefreshDgvContacts()来加载DataGridView。

答案 1 :(得分: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 Control Overview