【发布时间】:2021-01-10 12:47:16
【问题描述】:
我有一个显示 EmployeeModel 属性的 DataGridView 表。编译时,抛出此异常:
'ColumnCount property cannot be set on a data-bound DataGridView control.'
我听说在绑定到实际列表之前设置.Datasource = null 会有所帮助,但这样做并没有解决问题。我尝试删除 DataGridView 并重新创建它以防出现错误,但这并没有解决问题。
//CREATE EMPLOYEE TABLE
public void CreateEmployeeTable()
{
EmployeeGridView.DataSource = null;
EmployeeGridView.DataSource = globalEmployeeList;
EmployeeGridView.AutoGenerateColumns = false;
EmployeeGridView.ColumnCount = 9;
EmployeeGridView.Columns[0].HeaderText = "Employee ID";
EmployeeGridView.Columns[0].DataPropertyName = "ID";
EmployeeGridView.Columns[1].HeaderText = "First Name";
EmployeeGridView.Columns[1].DataPropertyName = "FirstName";
EmployeeGridView.Columns[2].HeaderText = "Last Name";
EmployeeGridView.Columns[2].DataPropertyName = "LastName";
EmployeeGridView.Columns[3].HeaderText = "Nickname";
EmployeeGridView.Columns[3].DataPropertyName = "Nickname";
EmployeeGridView.Columns[4].HeaderText = "Hire Date";
EmployeeGridView.Columns[4].DataPropertyName = "HireDate";
}
private void EmployeeGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
DataGridViewCell selectedEmployeeCell = EmployeeGridView.CurrentCell;
int selectedEmployeeRow = selectedEmployeeCell.RowIndex;
int selectedEmployeeID = (int)EmployeeGridView.Rows[selectedEmployeeRow].Cells[0].Value;
jobTitleListBox.DataSource = globalEmployeeList.Where(person => person.ID == selectedEmployeeID).ToList();
}
这是 SQL(是的,我最终将把它变成一个存储过程;我只是还没有。)
public async Task<List<EmployeeModel>> GetEmployeeList()
{
using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(GlobalConfig.CnnString("WorkDeskDB")))
{
var sql = @"SELECT e.id, e.FirstName, e.LastName, e.Nickname,
em.EmployeeID, em.Address, em.Type,
e.JobTitleID, jt.id, jt.Name,
p.EmployeeID, p.Number, p.Type,
ect.EmployeeID, ect.NameID, ect.InitialDate, ect.ExpirationDate,
ct.id, ct.Name
FROM dbo.Employees e
LEFT JOIN dbo.Emails em
ON em.EmployeeID = e.id
LEFT JOIN dbo.JobTitles jt
ON e.JobTitleID = jt.id
LEFT JOIN Phones p
ON p.EmployeeID = e.id
LEFT JOIN dbo.EmployeeCertificationType ect
ON ect.EmployeeID = e.id
LEFT JOIN dbo.CertificationType ct
ON ect.NameID = ct.id";
var employees = await connection.QueryAsync<EmployeeModel, EmailModel, TitleModel, PhoneModel, CertificationModel, EmployeeModel>(sql, (e, em, t, p, c) =>
{
e.EmailList.Add(em);
e.JobTitle = t;
e.PhoneList.Add(p);
e.CertificationList.Add(c);
return e;
}, splitOn: "EmployeeID, JobTitleID, EmployeeID, EmployeeID");
var result = employees.GroupBy(e => e.ID).Select(g =>
{
var groupedEmployee = g.First();
groupedEmployee.EmailList = g.Select(e => e.EmailList.Single()).ToList();
groupedEmployee.PhoneList = g.Select(e => e.PhoneList.Single()).ToList();
groupedEmployee.CertificationList = g.Select(e => e.CertificationList.Single()).ToList();
return groupedEmployee;
});
return result.ToList();
}
}
【问题讨论】:
-
你为什么要设置
ColumnCount,你应该只是删除数据绑定后不需要的列,或者设置AutoGenerateColumns = false并手动创建每一列 -
您是否尝试将列表绑定到
BindingSource并将其用作DataGridView.DataSource的源? The documentation 表示这是解决许多绑定问题的首选方法。 -
错误很明显...DataGridView.ColumnCount Property ...“异常”... “InvalidOperationException” ...“设置此属性时,已设置DataSource属性。 ” ....我会假设这是错误。注释掉代码并将不想显示的列设置为
Visible = false.或手动添加已注释的列。 -
虽然您不能直接(向上或向下)设置列数,但您可以在 DGV 中添加(和删除)列!
-
在我发布的代码中,我确实设置了 .AutoGenerateColumns = false,然后我继续手动添加列。我已删除 .ColumnCount 声明,因此不再收到该错误;但是,在运行时,datagridview 仍在自动生成列。例如,我最终得到两列 Hire Date。
标签: c# winforms datagridview