我正在尝试在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);
}
}
答案 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)]