none
c# nach vb RRS feed

  • Frage

  • Hallo

    kann/würde mir jemand die C# Zeilen nach VB übersetzen?
    Zwei Zeilen, mit   "//<<<< hier"  gekennzeichnet.

    Danke Peter

    public SortableBindingList() : base(new List<T>())
            {
                _sortDelegate = (list, comparison) => ((List<T>)list).Sort(comparison);   //<<<< hier
            }

            public SortableBindingList(IList<T> list) : base(list)
            {
                MethodInfo sortMethod = list.GetType().GetMethod("Sort", new[] { typeof(Comparison<T>) });   //<<<< hier
                if (sortMethod == null || sortMethod.ReturnType != typeof(void))
                {
                    throw new ArgumentException(
                        "The passed in IList<T> must support a \"void Sort(Comparision<T>)\" call or you must provide one using the other constructor.",
                        "list");
                }

                _sortDelegate = CreateSortDelegate(list, sortMethod);
            }

    Dienstag, 22. September 2015 14:04

Antworten

  • Hallo Peter,

    ungetestet aber in etwa so:

    Public Class SortableBindingList(Of T)
            Inherits System.ComponentModel.BindingList(Of T)
            Private ReadOnly _sortDelegate As Action(Of IList(Of T), Comparison(Of T))
    
            Public Sub New()
                MyBase.New(New List(Of T))
                _sortDelegate = Sub(list, comparison) DirectCast(list, List(Of T)).Sort(comparison)
            End Sub
    
            Public Sub New(list As IList(Of T))
                MyBase.New(list)
                Dim sortMethod = GetType(List(Of T)).GetMethod("Sort", {GetType(Comparison(Of T))})
                If sortMethod Is Nothing OrElse sortMethod.ReturnType <> GetType(Void) Then
                    Throw New ArgumentException(
                        "The passed in IList<T> must support a ""void Sort(Comparision<T>)"" call or you must provide one using the other constructor.",
                        "list")
                End If
                _sortDelegate = CreateSortDelegate(list, sortMethod)
            End Sub
        End Class

    setzt voraus, dass der _sortDelegate so aussieht wie von mir eingefügt.

    Gruß Elmar

    Mittwoch, 23. September 2015 07:02
    Beantworter

Alle Antworten

  • Hallo Peter,

    Zeile eins:

    _sortDelegate = (list, comparison) => ((List<T>)list).Sort(comparison)

    Zeile zwei:

    Dim sortMethod As MethodInfo =  list.GetType().GetMethod("Sort",New() As MethodInfo
    {
    	 Type.GetType(Comparison<T>) 
    }

    Siehe auch Tools wie bspw. http://www.dotnetspider.com/convert/Csharp-To-Vb.aspx


    Thomas Claudius Huber

    "If you can't make your app run faster, make it at least look & feel extremly fast"

    My latest Pluralsight-courses:
    XAML Layout in Depth
    Windows Store Apps - Data Binding in Depth

    twitter: @thomasclaudiush
    homepage: www.thomasclaudiushuber.com

    Dienstag, 22. September 2015 14:37
  • Hallo Thomas,

    danke für deine Bemühung.
    Aber das Funktioniert nicht.

    Gruss Peter

    Dienstag, 22. September 2015 15:48
  • Hallo

    kann/würde mir jemand die C# Zeilen nach VB übersetzen?
    Zwei Zeilen, mit   "//<<<< hier"  gekennzeichnet.

    Danke Peter

    private readonly Action<IList<T>, Comparison<T>> _sortDelegate;

    public SortableBindingList() : base(new List<T>())
            {
                _sortDelegate = (list, comparison) => ((List<T>)list).Sort(comparison);   //<<<< hier
            }

            public SortableBindingList(IList<T> list) : base(list)
            {
                MethodInfo sortMethod = list.GetType().GetMethod("Sort", new[] { typeof(Comparison<T>) });   //<<<< hier
                if (sortMethod == null || sortMethod.ReturnType != typeof(void))
                {
                    throw new ArgumentException(
                        "The passed in IList<T> must support a \"void Sort(Comparision<T>)\" call or you must provide one using the other constructor.",
                        "list");
                }

                _sortDelegate = CreateSortDelegate(list, sortMethod);
            }

    Mittwoch, 23. September 2015 06:38
  • Hallo Peter,

    "funktioniert nicht" heißt konkret was? Gibt es eine Fehlermeldung oder tut es nicht das, was Du erwartest?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 23. September 2015 06:47
  • Hallo Peter,

    ungetestet aber in etwa so:

    Public Class SortableBindingList(Of T)
            Inherits System.ComponentModel.BindingList(Of T)
            Private ReadOnly _sortDelegate As Action(Of IList(Of T), Comparison(Of T))
    
            Public Sub New()
                MyBase.New(New List(Of T))
                _sortDelegate = Sub(list, comparison) DirectCast(list, List(Of T)).Sort(comparison)
            End Sub
    
            Public Sub New(list As IList(Of T))
                MyBase.New(list)
                Dim sortMethod = GetType(List(Of T)).GetMethod("Sort", {GetType(Comparison(Of T))})
                If sortMethod Is Nothing OrElse sortMethod.ReturnType <> GetType(Void) Then
                    Throw New ArgumentException(
                        "The passed in IList<T> must support a ""void Sort(Comparision<T>)"" call or you must provide one using the other constructor.",
                        "list")
                End If
                _sortDelegate = CreateSortDelegate(list, sortMethod)
            End Sub
        End Class

    setzt voraus, dass der _sortDelegate so aussieht wie von mir eingefügt.

    Gruß Elmar

    Mittwoch, 23. September 2015 07:02
    Beantworter
  • Hallo Elmar,

    danke, der Code lässt sich so ausführen.

    Ich versuche mich mal wieder mit EF vertraut zu machen, was mir allerdings sehr schwer fällt.
    Ich finde es ist alle sehr kompliziert. Wobei es möglich ist, das ich das Vorgehen absolut nicht verstehe und zu sehr ado.net denke. Es fällt mir schwer anzunehmen, das ein Sortieren über den Header eines DataGridView so ein Umstand ist. Jedes mal die Liste mit Linq.OrderBy zu sortieren und wieder neu an DataGridView.DataSource zu hängen, kann es doch wohl nicht sein ?? Oder?

    Ich habe ein Stück Source gefunden
    http://likeshares.com/questions/571711/datagridview-sort-and-eg-bindinglist-in-net
    das dass sortieren des DataGridView möglich macht. Funktioniert bei Datum schon mal nicht.

    Hast du mir einen Link zu etwas, das Funktioniert und ich schauen kann wie es geht?

    Vielen Dank und Gruss
    Peter

    Mittwoch, 23. September 2015 12:02
  • Hallo Peter,

    eine Deiner wiederholten Versuche[1], Dich mit einem ORM (EF) anzufreunden?!

    Ich glaube schon früher dazu geschrieben zu haben, dass ein ORM (EF/LinqToSql uam.) nicht wirklich mit der Windows Forms Technologie harmoniert. Denn deren Datenbindung ist auf das DataSet mit DataView usw. ausgelegt worden. Die BindingList(T) wiederum wurde nur halbherzig mit .NET 2.0 implementiert und nie vervollständigt.

    Daraus resultieren diverse Einschränkungen, wie eben, dass das Klicken auf ein DataGridView nicht ohne Nachhilfe funktioniert.

    Der Original Beitrag findet sich auf Stackoverflow: DataGridView sort and e.g. BindingList<T> in .NET und dort gibt es weitere zum Thema. Die Lösung mit dem SortDelegate ist IMHO eher umständlich und ich bezweifle, dass Du sie so überhaupt einsetzen wirst (würde heißen: eine eigene IList(Of T) implementieren).

    Gruß Elmar

    [1] Ein altes Schätzchen: http://www.tech-archive.net/Archive/German/Entwicklung/microsoft.public.de.german.entwickler.dotnet.datenbank/2009-08/msg00011.html

    Mittwoch, 23. September 2015 14:25
    Beantworter
  • Hallo Elmar.

    Danke!

    >... nicht wirklich mit der Windows Forms Technologie harmoniert.
    Auf was ist die Datenbindung abgestimmt? Auf WPF?

    >Ein altes Schätzchen.
    Ich wusste das war was. Habe es nicht entdeckt.

    Gruss Peter

    Mittwoch, 23. September 2015 16:49