I have finally managed to put Anton's code to the test in my own custom field type with great results.
The underlying issue is that the Update method does not seem to get called when adding a new field, and because there are a number of initializations of the field object the values in the custom propery editor controls get lost before you get to the OnAdded event where you could set them!
So, Anton's plan (which I confirm works very well) is to store the values of the properties in a static string dictionary, keyed with the hash of the current SharePoint context SPContext.Current.GetHashCode() so we get the right property back out in the OnAdded event and can set the correct values.
You can get the full code in the thread linked to above, but I'll summarize as best I can. I'm using a property called Application that is set by selecting a value from a combo box - which is actually part of a parent child combination used in the Property Editor, but that's another story...
First we create a new dictionary in the Field Class (the one that inherits from the SPField... class) to store the properties:
private static Dictionary<int, string> updatedApplicationProperty = new Dictionary<int, string>();
Create a new method that the Property Editor Control can call to update the dictionary to the value in the property editor control:
public void UpdateApplicationProperty(string value)
{
updatedApplicationProperty[ContextId] = value;
}
Then, in the get for the property, return the dictionary stored property value if it exists or the internal value if not:
public string Application
get
{
if (updatedApplicationProperty.ContainsKey(ContextId))
{
//If we saved a value away and we're in the middle of the save field process, then pull it out.
return updatedApplicationProperty[ContextId];
}
else
{
//Return the existing value for the application property. This will be the case if we already have a field.
return sApplication;
}
}
In the Update method of the Field Control set the custom property value and remove the stored property value:
this.SetCustomProperty("Application", this.Application);
if (updatedApplicationProperty.ContainsKey(ContextId))
updatedApplicationProperty.Remove(ContextId);
And, lastly, in the OnSaveChange event in the class for the Property Editor Control store the value of the control that represents the property into the dictionary via the Update...Property method for a new field, or set the property as normal if the field already exists:
BDCField currentBDCField = field as BDCField;
if (isNewField)
{
currentBDCField.UpdateApplicationProperty(this.cboApplications.SelectedValue);
}
else
{
currentBDCField.Application = this.cboApplications.SelectedValue;
}
Hopefully that's a reasonable description of the required steps. Anton has a good description of the why he chose the static dictionary in the forum post.
Thanks again Anton and sorry it took me sooooo long to try it out!!!