This part. Commented code is cs. On compile catch an error:
Error 78
error C3766: 'Sample::NoteInfo' must provide an implementation for the interface method 'System::String ^System::ComponentModel::IDataErrorInfo::default::get(System::String ^)'
d:\dev\docstreet\sample\pointInfoStoreClass.h 100
What's incorrect? Why VS compiler consider this not implemented?
//Returns an error description set for the item's property
//String^ IDataErrorInfo.this[String^ columnName] {
// get {
// return GetColumnError(columnName);
// }
//}
public: property String^ IDataErrorInfo[String^] {
virtual String^ get(String^ index) override {
return GetColumnError(index);
}
}
Full code:
public ref class NoteInfo : IDataErrorInfo {
int fDay;
int fMonth;
int fYear;
int fNoteID;
//References the item's owner
ProjectNotes^ owner;
//Stores error descriptions for the Day, Month, Year and NoteID properties
Hashtable^ propertyErrors;
//Stores an error description for the item
String^ fNoteError;
public: NoteInfo(int noteID, int day, int month, int year) {
fNoteID = noteID;
fDay = day;
fMonth = month;
fYear = year;
//Set errors to empty strings
propertyErrors = gcnew Hashtable();
propertyErrors->Add('Day', '');
propertyErrors->Add('Month', '');
propertyErrors->Add('Year', '');
propertyErrors->Add('NoteID', '');
fNoteError = '';
Owner = nullptr;
}
public: property int NoteID {
int get() { return fNoteID; }
void set(int value) {
if(fNoteID == value) return;
fNoteID = value;
}
}
public: void ClearErrors() {
SetColumnError('Day', '');
SetColumnError('Month', '');
SetColumnError('Year', '');
fNoteError = '';
}
//Sets an error for an item's property
public: void SetColumnError(String^ elem, String^ error) {
if(propertyErrors->ContainsKey(elem)) {
if((String^)propertyErrors[elem] == error) return;
propertyErrors[elem] = error;
}
}
//Gets an error for an item's property
public: String^ GetColumnError(String^ elem) {
if(propertyErrors->ContainsKey(elem))
return (String^)propertyErrors[elem];
else
return '';
}
//The owner collection
internal: property ProjectNotes^ Owner {
ProjectNotes^ get() { return owner; }
void set(ProjectNotes^ value) { owner = value; }
}
#pragma region IDataErrorInfo Members
//Returns an error description set for the item's property
//String^ IDataErrorInfo.this[String^ columnName] {
// get {
// return GetColumnError(columnName);
// }
//}
public: property String^ IDataErrorInfo[String^] {
virtual String^ get(String^ index) override {
return GetColumnError(index);
}
}
//Returns an error description set for the current item
public: property String^ Error {
virtual String^ get() { return fNoteError; }
}
#pragma endregion
};
Both the C# and the C++/CLI languages require a special name for the indexer of a class to allow the compiler to recognize it as the indexer. C# uses this , C++/CLI uses the default keyword. The MSDN Library calls it "Item" to add to the confusion, somewhat inevitably since the name depends on the language. So it must look like this:
public: property String^ default[String^] {
virtual String^ get(String^ index) {
// etc...
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.