We are using Winforms Q3 2011. In our application, many of our dropdown lists are populated from lookup tables, so we have a generic method that maps to a lookup type, and we set the datasource to that:
Dim MyList as List(of AC.Lookup) = '... EF code
ddl.DataSource = MyList
Many of the lists are not required fields, so the proper default is to have nothing selected. When this is the case, however, the dropdown lists will have "AC.Lookup" displayed (where AC is the namespace for this EDMX file). After investigating, what appears to be happening is that the datasource doesn't quite know what to do with an empty list, so somehow it is calling the ToString.
This is confusing to the users. :-) I first looked for a "default text" or some other such property on the dropdown list, and when I couldn't find that, I tried to do various hacks, mainly around setting the text to nothing after some event (DataBinding, TextChanged, whatever). That method failed, too. What I ended up doing was creating a partial class tied to the Lookup class (the original Lookup class is generated from the designer, so I didn't want to change it), overriding ToString to return String.Empty. That worked and solved our problem, but it still seems very hackish.
Do you have a better, more elegant solution?
Thanks!
foreach
(GridViewDataColumn dataColumn
in
radGridBatches.Columns)
{
dataColumn.TextAlignment = ContentAlignment.BottomRight;
dataColumn.FormatString =
"{0:F2}"
;
}
base
.CreateChildElements();
//Setup the name label and field in a stack panel layout
this
.nameStackPanelElement =
new
StackLayoutElement();
this
.nameStackPanelElement.Orientation = Orientation.Horizontal;
this
.nameStackPanelElement.ElementSpacing = 17;
this
.nameStackPanelElement.StretchHorizontally =
true
;
this
.nameLabelElement =
new
RadLabelElement();
this
.nameLabelElement.Text =
"Name"
;
this
.nameLabelElement.AutoSize =
true
;
this
.nameLabelElement.StretchHorizontally =
false
;
this
.nameTextBoxElement =
new
RadTextBoxElement();
this
.nameTextBoxElement.StretchHorizontally =
true
;
this
.nameTextBoxElement.MinSize =
new
Size(120, 0);
this
.nameTextBoxElement.TextBoxItem.MaxLength = 100;
this
.nameTextBoxElement.TextBoxItem.LostFocus +=
new
EventHandler(NameTextBoxItem_LostFocus);
this
.nameTextBoxElement.TextChanged +=
new
EventHandler(ImportantField_TextChanged);
this
.nameStackPanelElement.Children.Add(
this
.nameLabelElement);
this
.nameStackPanelElement.Children.Add(
this
.nameTextBoxElement);
//Setup the script label and field in a stack panel layout
this
.scriptStackPanelElement =
new
StackLayoutElement();
this
.scriptStackPanelElement.Orientation = Orientation.Horizontal;
this
.scriptStackPanelElement.ElementSpacing = 18;
this
.scriptStackPanelElement.StretchHorizontally =
true
;
this
.scriptLabelElement =
new
RadLabelElement();
this
.scriptLabelElement.Text =
"Script"
;
this
.scriptLabelElement.AutoSize =
true
;
this
.scriptLabelElement.StretchHorizontally =
false
;
this
.scriptTextBoxElement =
new
RadTextBoxElement();
this
.scriptTextBoxElement.StretchHorizontally =
true
;
this
.scriptTextBoxElement.MinSize =
new
Size(120, 0);
this
.scriptTextBoxElement.TextBoxItem.MaxLength = 30;
this
.scriptTextBoxElement.TextBoxItem.LostFocus +=
new
EventHandler(ScriptTextBoxItem_LostFocus);
this
.scriptTextBoxElement.TextChanged +=
new
EventHandler(ImportantField_TextChanged);
this
.scriptStackPanelElement.Children.Add(
this
.scriptLabelElement);
this
.scriptStackPanelElement.Children.Add(
this
.scriptTextBoxElement);
//Setup the modifier label and drop down list in a stack panel layout
this
.modifierStackPanelElement =
new
StackLayoutElement();
this
.modifierStackPanelElement.Orientation = Orientation.Horizontal;
this
.modifierStackPanelElement.ElementSpacing = 4;
this
.modifierStackPanelElement.StretchHorizontally =
true
;
this
.modifierLabelElement =
new
RadLabelElement();
this
.modifierLabelElement.Text =
"Modifier"
;
this
.modifierLabelElement.AutoSize =
true
;
this
.modifierLabelElement.StretchHorizontally =
false
;
this
.modifierDropDownListElement =
new
RadDropDownListElement();
this
.modifierDropDownListElement.StretchHorizontally =
true
;
this
.modifierDropDownListElement.MinSize =
new
Size(60, 0);
this
.modifierDropDownListElement.DropDownStyle = RadDropDownStyle.DropDownList;
this
.modifierDropDownListElement.SelectedIndexChanged +=
new
Telerik.WinControls.UI.Data.PositionChangedEventHandler(modifierDropDownListElement_SelectedIndexChanged);
this
.modifierStackPanelElement.Children.Add(
this
.modifierLabelElement);
this
.modifierStackPanelElement.Children.Add(
this
.modifierDropDownListElement);
//Fill the modifier drop down list and select the zeroth element
foreach
(ModKeys mod
in
Enum.GetValues(
typeof
(ModKeys)))
{
this
.modifierDropDownListElement.Items.Add(mod.ToString());
}
//Setup the key label and field in a stack panel layout
this
.keyStackPanelElement =
new
StackLayoutElement();
this
.keyStackPanelElement.Orientation = Orientation.Horizontal;
this
.keyStackPanelElement.ElementSpacing = 4;
this
.keyLabelElement =
new
RadLabelElement();
this
.keyLabelElement.Text =
"Key"
;
this
.keyLabelElement.AutoSize =
true
;
this
.keyLabelElement.StretchHorizontally =
false
;
this
.keyTextBoxElement =
new
RadTextBoxElement();
this
.keyTextBoxElement.StretchHorizontally =
true
;
this
.keyTextBoxElement.MinSize =
new
Size(34, 0);
this
.keyTextBoxElement.TextBoxItem.MaxLength = 1;
this
.keyTextBoxElement.TextBoxItem.LostFocus +=
new
EventHandler(KeyTextBoxItem_LostFocus);
this
.keyTextBoxElement.TextChanged +=
new
EventHandler(ImportantField_TextChanged);
this
.keyStackPanelElement.Children.Add(
this
.keyLabelElement);
this
.keyStackPanelElement.Children.Add(
this
.keyTextBoxElement);
//Combine the key and modifier panels into one stack panel layout
this
.modifierKeyStackPanelElement =
new
StackLayoutElement();
this
.modifierKeyStackPanelElement.Orientation = Orientation.Horizontal;
this
.modifierKeyStackPanelElement.ElementSpacing = 4;
this
.modifierKeyStackPanelElement.StretchHorizontally =
true
;
this
.modifierKeyStackPanelElement.Children.Add(
this
.modifierStackPanelElement);
this
.modifierKeyStackPanelElement.Children.Add(
this
.keyStackPanelElement);
//Setup the save and cancel buttons in a stack panel layout
this
.newButtonsStackPanelElement =
new
StackLayoutElement();
this
.newButtonsStackPanelElement.Orientation = Orientation.Horizontal;
this
.newButtonsStackPanelElement.ElementSpacing = 4;
this
.newButtonsStackPanelElement.StretchHorizontally =
true
;
Padding newButtonsStackMargin =
this
.newButtonsStackPanelElement.Margin;
this
.newButtonsStackPanelElement.Margin =
new
Padding(52, newButtonsStackMargin.Top,
-12, newButtonsStackMargin.Bottom);
this
.saveButtonElement =
new
RadButtonElement(
"Save"
);
this
.saveButtonElement.Enabled =
false
;
this
.saveButtonElement.Click +=
new
EventHandler(saveButtonElement_Click);
this
.cancelButtonElement =
new
RadButtonElement(
"Cancel"
);
this
.cancelButtonElement.Click +=
new
EventHandler(deleteCancelButtonElement_Click);
this
.newButtonsStackPanelElement.Children.Add(
this
.saveButtonElement);
this
.newButtonsStackPanelElement.Children.Add(
this
.cancelButtonElement);
//Setup the insert and delete buttons in a stack panel layout and set them
//to collapsed initially.
this
.existingButtonsStackPanelElement =
new
StackLayoutElement();
this
.existingButtonsStackPanelElement.Orientation = Orientation.Horizontal;
this
.existingButtonsStackPanelElement.Visibility = ElementVisibility.Collapsed;
this
.existingButtonsStackPanelElement.ElementSpacing = 4;
this
.existingButtonsStackPanelElement.StretchHorizontally =
true
;
Padding existingButtonsStackMargin =
this
.existingButtonsStackPanelElement.Margin;
this
.existingButtonsStackPanelElement.Margin =
new
Padding(52, existingButtonsStackMargin.Top - 4,
-12, existingButtonsStackMargin.Bottom + 4);
this
.insertButtonElement =
new
RadButtonElement(
"Insert"
);
this
.insertButtonElement.Click +=
new
EventHandler(insertButtonElement_Click);
this
.deleteButtonElement =
new
RadButtonElement(
"Delete"
);
this
.deleteButtonElement.Click +=
new
EventHandler(deleteCancelButtonElement_Click);
this
.existingButtonsStackPanelElement.Children.Add(
this
.insertButtonElement);
this
.existingButtonsStackPanelElement.Children.Add(
this
.deleteButtonElement);
//Setup the separator that will separate this item from the one below it
this
.itemSeparator =
new
SeparatorElement();
this
.itemSeparator.StretchHorizontally =
true
;
this
.itemSeparator.Line1.BackColor = Color.FromArgb(76, 76, 76);
//Padding separatorMargin = itemSeparator.Margin;
//this.itemSeparator.Margin = new Padding(separatorMargin.Left, separatorMargin.Top + 4, separatorMargin.Right, separatorMargin.Bottom);
//Setup the outermost stack panel layout element and add all
//of the other stack panel layout elements as its children.
this
.parentStackPanelElement =
new
StackLayoutElement();
this
.parentStackPanelElement.Orientation = Orientation.Vertical;
this
.parentStackPanelElement.ElementSpacing = 4;
this
.parentStackPanelElement.Margin =
new
Padding(4);
this
.parentStackPanelElement.StretchHorizontally =
true
;
this
.parentStackPanelElement.Children.Add(
this
.nameStackPanelElement);
this
.parentStackPanelElement.Children.Add(
this
.scriptStackPanelElement);
this
.parentStackPanelElement.Children.Add(
this
.modifierKeyStackPanelElement);
this
.parentStackPanelElement.Children.Add(
this
.newButtonsStackPanelElement);
this
.parentStackPanelElement.Children.Add(
this
.existingButtonsStackPanelElement);
this
.parentStackPanelElement.Children.Add(
this
.itemSeparator);
//Finally, add the outermost stack panel layout element to the
//SimpleListViewVisualItem's Children
this
.Children.Add(
this
.parentStackPanelElement);
lock
(Program.scriptsLockObject)
{
base
.SynchronizeProperties();
this
.Text =
""
;
this
.Script =
this
.Data.Value
as
Script;
if
(
this
.Script !=
null
)
{
if
(
this
.Script.IsNew)
{
this
.newButtonsStackPanelElement.Visibility = ElementVisibility.Visible;
this
.existingButtonsStackPanelElement.Visibility = ElementVisibility.Collapsed;
//if (!this.IsElementVisible)
//{
//}
this
.nameTextBoxElement.Focus();
}
else
{
this
.newButtonsStackPanelElement.Visibility = ElementVisibility.Collapsed;
this
.existingButtonsStackPanelElement.Visibility = ElementVisibility.Visible;
this
.insertButtonElement.Enabled = !
string
.IsNullOrWhiteSpace(
this
.Script.ScriptText);
}
this
.nameTextBoxElement.Text =
this
.Script.Name;
this
.scriptTextBoxElement.Text =
this
.Script.ScriptText;
this
.modifierDropDownListElement.SelectedIndex = (
int
)
this
.Script.KeyModifier;
this
.keyTextBoxElement.Text =
this
.Script.Key;
}
}