Jag vill göra en UserControl som skall användas till att skapa värden. Denna dialog kommer att se typ likadan ut för en mängd olika typer. Så jag vill göra den generic.
I dialogen kommer det finnas.
- Groupbox
- Combobox(DropDownList)
- Label
- TextBox
- Tooltip
Comboxen skall innehålla enum-värden. Dessa enum-värden skall komma från den klass som man har som argument till genericen. Enumen skall ha samma namn hos alla klasser som man använder som argument till genericen. Vilket gör att man skulle vilja definiera ett interface som tvingar implementatören att implementera en enum med ett visst namn. Comboboxen skall starta på ett visst värde så det interfacet jag talade om tidigare måste också ha en funktion som talar om vilket standard(default) värdet för enumen är. Implementationen för denna funktion kommer ju att se likadan ut hos alla klasser som implementerar interfacet d.v.s:
public class MyClass : MyInterface
{
enum MyEnum
{
ett,
tva,
tre
}
MyEnum GetDefault() { return MyEnum.ett; }
};
Så tyckte jag att det borde vara möjligt att göra funktionen statisk så att jag slipper allokera ett objekt bara för att kalla på funktionen.
Eftersom man sedan vill kunna skriva tillbaka värdet till dialogen eftersom man vill kunna ändra på värdet beroende på vilket värde som man väljer i comboboxen så måste det finnas en ToString funktion som tar enum-värde som argument(och kanske också en CultureInfo).
Så som den naiva programmera jag är så trodde jag att det "bara" skulle gå och göra följande.
public interface IMyUserControl
{
enum MyEnum; // Now every implementor needs to have this enum.
static MyEnum GetDefault(); // Every implementation needs to have a way to get the default value for the enum.
string ToString(MyEnum enum, CultureInfo cultureInfo); // a tostring method.
};
public partial class MyUserControl<TType> : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
}
partial class MyUserControl<TType>
where TType : IMyUserControl
{
private void InitializeComponent()
{
this.myGroupBox = new GroupBox();
this.myTextBox = new TextBox();
this.myComboBox = new ComboBox();
this.myLabel = new Label();
this.myToolTip = new ToolTip();
this.myGroupBox.Controls.Add(this.myComboBox);
this.myGroupBox.Controls.Add(this.myTextBox);
this.myGroupBox.Controls.Add(this.myLabel);
//bla bla bl
foreach(var value in Enum.GetValues(typeof(TType.MyEnum))) {this.myComboBox.Items.Add(value);}
this.myComboBox.SelectedItem = TType.GetDefault();
}
private myGroupBox;
private myTextBox;
private myComboBox;
private myLabel;
private myToolTip;
}
void main()
{
MyDialog<MyClass> myDialog = new MyDialog<MyClass>();
}
Jag vet att det finns en rad saker som inte går att uppnå riktigt. Men det var något i stil med detta som jag försökte åstadkomma.