我正在对现有项目进行一些更改,并且我想在Column
中添加新的DataGridView
。我正在做以下事情:
DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
cb.HeaderText = "Process";
cb.Width = 100;
dgvVacationCalendar.Columns.Insert(2,cb );
问题是我正在执行这段代码的方法被调用多次,导致多次插入。
如何在第一次调用此方法后阻止此插入?
答案 0 :(得分:0)
使用当前代码的最简单方法是检查列数,如果该数字是原始列,则只添加新列。
假设你的网格有5列,你可以这样做:
if(dgvVacationCalendar.Columns.Count == 5) {
DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
cb.HeaderText = "Process";
cb.Width = 100;
dgvVacationCalendar.Columns.Insert(2, cb);
}
或者,您可以检查网格是否具有HeaderText = "Process"
的列,并且只有在网格没有的情况下才添加它。
然而,这两种方法的问题在于它们非常脆弱。如果将来你的网格列发生了变化,那么这两种方法可能会工作不正常,你会浪费一些时间来查找错误。最好为列添加唯一名称:
cb.Name = "ProcessColumn";
然后您可以检查网格是否有一个具有该名称的列:
if(!dgvVacationCalendar.Columns.Contains("ProcessColumn")) {
DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
cb.HeaderText = "Process";
cb.Width = 100;
dgvVacationCalendar.Columns.Insert(2, cb);
}
这是一种更具前瞻性的方法。如果尝试添加另一个具有相同名称的列,则会出现明显的错误。
答案 1 :(得分:0)
这个怎么样?
if(!dataGridView1.Columns.Cast<DataGridViewColumn>().Any(x=> x.HeaderText == "Process")) {
DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
cb.HeaderText = "Process";
cb.Width = 100;
dgvVacationCalendar.Columns.Insert(2,cb );
}
或者您可以使用ColumnAdded
这样的事件:
private void DataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
foreach(DataGridViewColumn item in dataGridView1.Columns)
{
if(e.Column.HeaderText == item.HeaderText)
{
dataGridView1.Columns.Remove(e.Column);
}
}
}
答案 2 :(得分:0)
我不确定我是否必须在这里打开一个新问题。但是作为我上一个问题的更新。现在它没有在DataGridViewComboBoxColumn中显示我的列表,我在这里缺少什么?
this.DataGridView1.ColumnCount = Constants.Vacation_Calendar.Total_Calendar_Days + 2;
this.DataGridView1.Columns[0].Name = "Resource";
this.DataGridView1.Columns[0].Width = 100;
this.DataGridView1.Columns[1].Name = "Month";
this.DataGridView1.Columns[1].Width = 60;
DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
List<Process> getAllProcesses = this.bl_process.getAll_Process();
List<String> getApplication= new List<string>();
foreach (Process process in getAllProcesses)
{
getApplication.Add(process.Application);
}
if (!DataGridView1.Columns.Cast<DataGridViewColumn>().Any(x => x.Name == "ProcessColumn"))
{
cb.HeaderText = "Process";
cb.Name = "ProcessColumn";
cb.Width = 100;
cb.DataSource = getApplication;
cb.ReadOnly = false;
DataGridView1.Columns.Insert(2, cb);
}
加上尽管事实上我不再插入新列,但我仍然得到一个错误,我这样处理:
in the designer
this.DataGridView1.DataError + = new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.DataGridView1_DataError);
and in codebehind:
private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)