首次执行my方法后阻止插入

时间:2018-02-12 17:29:07

标签: c# .net winforms datagridview

我正在对现有项目进行一些更改,并且我想在Column中添加新的DataGridView。我正在做以下事情:

DataGridViewComboBoxColumn cb = new DataGridViewComboBoxColumn();
cb.HeaderText = "Process";
cb.Width = 100;
dgvVacationCalendar.Columns.Insert(2,cb );

问题是我正在执行这段代码的方法被调用多次,导致多次插入。

如何在第一次调用此方法后阻止此插入?

3 个答案:

答案 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)