12 Stimmen

Übergabe einer int-Liste als Parameter an eine Web-Benutzersteuerung

Ich möchte eine int-Liste (Liste) als deklarative Eigenschaft an ein Web-Benutzer-Steuerelement wie folgt übergeben:

<UC:MyControl runat="server" ModuleIds="1,2,3" />

Zu diesem Zweck habe ich einen TypeConverter erstellt:

public class IntListConverter : System.ComponentModel.TypeConverter
{
    public override bool CanConvertFrom(
           System.ComponentModel.ITypeDescriptorContext context, 
           Type sourceType)
    {
        if (sourceType == typeof(string)) return true;
        return base.CanConvertFrom(context, sourceType);
    }
    public override object ConvertFrom(
      System.ComponentModel.ITypeDescriptorContext context, 
      System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            string[] v = ((string)value).Split(
                new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            List<int> list = new List<int>();
            foreach (string s in vals)
            {
                list.Add(Convert.ToInt32(s));
            }
            return list
        }
        return base.ConvertFrom(context, culture, value);
    }
    public override bool CanConvertTo(ITypeDescriptorContext context,
      Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor)) return true;
        return base.CanConvertTo(context, destinationType);
    }
    public override object ConvertTo(ITypeDescriptorContext context,
      System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor) && value is List<int>)
        {
            List<int> list = (List<int>)value;
            ConstructorInfo construcor = typeof(List<int>).GetConstructor(new Type[] { typeof(IEnumerable<int>) });
            InstanceDescriptor id = new InstanceDescriptor(construcor, new object[] { list.ToArray() });
            return id;
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

Und fügte dann das Attribut zu meiner Eigenschaft hinzu:

[TypeConverter(typeof(IntListConverter))]
public List<int> ModuleIds
{
    get { ... }; set { ... };
}

Aber ich erhalte diesen Fehler zur Laufzeit:

Unable to generate code for a value of type 'System.Collections.Generic.List'1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'. This error occurred while trying to generate the property value for ModuleIds.

Meine Frage ist ähnlich wie die folgende aquí , aber die Lösung löst mein Problem nicht:

Aktualisierung: Ich habe eine Seite gefunden, die das erste Problem gelöst hat. Ich habe den Code oben aktualisiert, um meine Korrekturen zu zeigen. Der hinzugefügte Code ist der CanConvertTo y ConvertTo Methoden. Jetzt bekomme ich einen anderen Fehler..:

Object reference not set to an instance of an object.

Dieser Fehler scheint indirekt durch etwas in der ConvertTo Methode.

0voto

James Curran Punkte 98228

Ich glaube, das Problem ist die Menge{}. Der Typkonverter möchte die List<int> zurück in eine Zeichenkette, aber CanConvertFrom() versagt bei List<int> .

0voto

jkind Punkte 9

Sie können sie in eine Zeichenkette einfügen und durch ein Komma trennen, um eine private Variable zu füllen. Hat nicht die Feinheiten der Zuschreibung, aber wird funktionieren.

private List<int> modules;
public string ModuleIds
{
  set{
    if (!string.IsNullOrEmpty(value))
    {
    if (modules == null) modules = new List<int>();
    var ids = value.Split(new []{','});
    if (ids.Length>0)
      foreach (var id in ids)
        modules.Add((int.Parse(id)));
    }
}

0voto

Aaron Powell Punkte 24630

Ich denke, dass Sie die beste Option ist, um Ihre Benutzerkontrolle haben eine DataSource-Stil-Eigenschaft zu machen.

Sie nehmen die Eigenschaft als Objekt und führen dann eine Typüberprüfung gegen IList/ IEnumerable/ usw. durch, um sicherzustellen, dass sie korrekt ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X