我目前正在尝试将信息输入到数据网格视图中,但是当我尝试这样做时,如果用户选择了一个单元格,之后将没有值,我使用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后但这意味着只显示最后一行
我会感激任何帮助
感谢
答案 0 :(得分:1)
Alex,您正在使用未绑定的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();
}
请注意,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。
答案 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