清除数据绑定datagridview中的单元格内容

时间:2017-06-05 23:00:42

标签: c# winforms visual-c++ datagridview

我正在尝试在DataGridView中实现删除功能,以清除突出显示的单元格的内容。

其中一列包含一个double,当值小于零时,我将其显示为空白。如果用户将单元格编辑为空白,则通过CellParsing事件处理。

DataGridView使用BindingSource和BindingList进行数据绑定。

我遇到的问题是当我通过clear函数将单元格值更改为空白时,CellParsing事件不会触发,我得到一个FormatException,说“”不是Double的有效值。当用户清除单元格时,CellParsing事件将触发,一切都按预期发生。

我将值设置为空白的原因是某些列是文本而其他列是数字,我希望能够一次删除它们。

我用Google搜索并搜索了StackOverflow,但还没有发现可以解决我问题的内容。有没有办法通过CellParsing事件或其他一些我缺少的明显解决方案来解决这个问题?

请参阅下面的CellParsing和清除代码。

System::Void dataGridViewWells_CellParsing(System::Object^  sender, System::Windows::Forms::DataGridViewCellParsingEventArgs^  e)
{
    //Handle blank values in the mass column
    e->ParsingApplied = false;
    if(this->dataGridViewWells->Columns[e->ColumnIndex]->HeaderText == "Mass (ng)")
    {
        if(e->Value->ToString() == "" || e->Value->ToString() == " ")
        {
            e->Value = -1.0;
            e->ParsingApplied = true;
        }
    }
}

void DeleteHighlightedCells(DataGridView^ dgv)
{
    try
    {
        System::Windows::Forms::DataGridViewSelectedCellCollection^ sCells = dgv->SelectedCells;
        for(int i = 0; i < sCells->Count; i++)
        {
            if(!sCells[i]->ReadOnly)
            {
                dgv->Rows[sCells[i]->RowIndex]->Cells[sCells[i]->ColumnIndex]->Value = "";
            }
        }
    }
    catch(Exception^ e)
    {
        LogError("Unable to delete contents of DataGridView cells: " + e->ToString());
    }
}

System::Void dataGridViewWells_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e)
{
    if(e->Control && e->KeyCode == Keys::C)
    {
        this->CopyContentsToClipBoard(this->dataGridViewWells);
    }

    if(e->Control && e->KeyCode == Keys::V)
    {
        this->PasteContentsFromClipBoard(this->dataGridViewWells);
    }

    if(e->KeyCode == Keys::Delete)
    {
        this->DeleteHighlightedCells(this->dataGridViewWells);
    }
}

1 个答案:

答案 0 :(得分:0)

我最终放弃了CellParsing事件并为我的类属性添加了自定义TypeConverter,如this question中所做。

TypeConverter代码:

public ref class MassTypeConverter : System::ComponentModel::TypeConverter
{
public:
    virtual bool CanConvertFrom(System::ComponentModel::ITypeDescriptorContext^ context, Type^ sourceType) override
    {
        return sourceType == String::typeid || System::ComponentModel::TypeConverter::CanConvertFrom(context, sourceType);
    }
    virtual Object^ ConvertFrom(System::ComponentModel::ITypeDescriptorContext^ context, System::Globalization::CultureInfo^ culture, Object^ value) override
    {
        if(value != nullptr && value->GetType() == String::typeid)
        {
            //
            double converted;
            bool success = double::TryParse((String^)value, converted);
            if(((String^)value) == "" || ((String^)value) == " ")
            {
                converted = -1.0;
                success = true;
            }
            if(success)
            {
                return converted;
            }
        }
        return System::ComponentModel::TypeConverter::ConvertFrom(context, culture, value);
    }
};

然后在我的类Property上面添加以下内容:

[System::ComponentModel::TypeConverter(MassTypeConverter::typeid)]