Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Rioma
Thema: [erledigt] TextBox Binding an ListViewItem Objekt
Am im Forum: GUI: WPF und XAML

Das sind alles wichtige hinweise, aber wie bereits gesagt, wird meine GUI aktualisiert und deswegen war ich so verwundert.

Eine CollectionView wird gefüttert mit einer List<T>, die CollectionView hängt an einer ListView.
Dann gibt es Textboxen, die an der SelectedValue.Eigenschaft hängen.
Sobald ich hier aktualsiere und die Textbox den Focus verliert, wird die Eigenschaft gesetzt und die ListView akktualisiert. Alles ohne INotifyPropertyChanged.

Thema: [erledigt] TextBox Binding an ListViewItem Objekt
Am im Forum: GUI: WPF und XAML

Wie gesagt ich habe es getestet. Es funktioniert aus irgendeinem Grund auch ohne, ich habe mir einen Haltepunkt im Setter gesetzt und Sobald ich in der TextBox (SongName) etwas änder, und in der ListView das Item wechsel, springt er in den Setter und ändert die Eigenschaft.


using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using File = TagLib.File;

namespace MusicBox
{
    public class MusicSongs
    {
        public static List<MusicSongs> MSongsTemp = new List<MusicSongs>();

        private TagLib.File _tagLibFile;

        private string _songName;

        public string SongName
        {
            get { return _songName; }
            set { _songName = value; } //HALTEPUNKT
        }
      
        public string SongGenre { get; set; }
        public string SongInterpret { get; set; }
        public string SongYear { get; set; }
        public TimeSpan SongTime { get; set; }
        public ImageSource SongCover { get; set; }

        public string SongKind { get; set; }
        public DateTime SongDateAdded { get; set; }
        public string SongContent { get; set; }
        public string SongPath { get; set; }



        public MusicSongs(File tagLibFile, string path)
        {
            _tagLibFile = tagLibFile;
            SongPath = path;
            FillProperties();
            MSongsTemp.Add(this);
        }

        private void FillProperties()
        {
            SongName = _tagLibFile.Tag.Title;
            SongGenre = _tagLibFile.Tag.FirstGenre;
            SongYear = _tagLibFile.Tag.Year.ToString(CultureInfo.InvariantCulture);
            SongTime = _tagLibFile.Properties.Duration;
            SongKind = SongPath.Substring(SongPath.Length - 4, 4);
            SongInterpret = _tagLibFile.Tag.FirstAlbumArtist;
            SongDateAdded = DateTime.Now;

            try
            {
                TagLib.IPicture p = _tagLibFile.Tag.Pictures[0];
                string coverPath = "Image/" + _tagLibFile.Tag.FirstAlbumArtist + "/" + _tagLibFile.Tag.Album + "/Cover.jpg";

                if (!System.IO.File.Exists(coverPath))
                {

                    if (!Directory.Exists("Image/" + _tagLibFile.Tag.FirstAlbumArtist + "/" + _tagLibFile.Tag.Album))
                        Directory.CreateDirectory("Image/" + _tagLibFile.Tag.FirstAlbumArtist + "/" +
                                                  _tagLibFile.Tag.Album);

                    System.IO.File.WriteAllBytes(coverPath, p.Data.Data);
                }

                this.SongCover = new BitmapImage(new Uri(coverPath, UriKind.Relative));
            }
            catch { }

            SongContent = "Published: " + SongYear + Environment.NewLine +
           "Time: " + Math.Round(SongTime.TotalMinutes, 2) + " min " + Environment.NewLine +
           "Kind: " + SongKind;
        }
    }
}

Ist natürlich unpraktisch, wenn man immer erst das Item wechseln muss, aber es wäre auch unpraktisch, wenn ich inotifypropertychanged implementiere und die Eigenschaft 2 mal geändert wird, obwohl 1 mal reicht.

Hat jemand eine Idee woran es liegt?


Edit: Sorry, es reicht wenn ich aus der Textbox rausgehe. Es wird dann die Eigenschaft gesetzt. Wenn ich inotifypropertychanged implementiere, macht es keinen unterscheid. Es wird nur einmal gesetzt. Sehr komisch...


Edit2: Könnte daran liegen, das der DefaultWert vom UpdateSourceTrigger bei Textboxen LostFocus ist und nicht PropertyChanged, oder?

Thema: [erledigt] TextBox Binding an ListViewItem Objekt
Am im Forum: GUI: WPF und XAML

Danke das wird warscheinlich das Problem sein. Also ich Klicke mir meine GUI nicht zusammen, ich schreibe den XAML Code und habe darüber sofort das Ergebnis. Deswegen sprach ich vom Designer :)

2 Fragen haben sich jetzt aber leider noch aufgetan:

1)
Alle Felder werden nun aktualisiert, soabalb ich ein anderes Item ausgewählt habe. Nur meine ImageSource nicht.

So sieht mein Xaml Code aus:


 <Image  DockPanel.Dock="Right" Height="125" Source="{Binding ElementName=ListSongs, Path=SelectedValue.SongCover}">
                        <Image.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Entfernen" Click="CoverEntfernen_Click"/>
                            </ContextMenu>
                        </Image.ContextMenu>
                    </Image>

und hier der C# code:


   try
            {
                TagLib.IPicture p = _tagLibFile.Tag.Pictures[0];
                string coverPath = "Image/" + _tagLibFile.Tag.FirstAlbumArtist + "/" + _tagLibFile.Tag.Album + "/Cover.jpg";

                if (!Directory.Exists("Image/" + _tagLibFile.Tag.FirstAlbumArtist + "/" + _tagLibFile.Tag.Album))
                    Directory.CreateDirectory("Image/" + _tagLibFile.Tag.FirstAlbumArtist + "/" + _tagLibFile.Tag.Album);

                if (!System.IO.File.Exists(coverPath))
                    System.IO.File.WriteAllBytes(coverPath, p.Data.Data);

                this.SongCover = new BitmapImage(new Uri(coverPath, UriKind.Relative));
            }
            catch { }

Das mit dem Cover rausziehen und extern speichern funktioniert übrigens und der Pfad stimmt natürlich auch. Beachte ich bei der ImageSource irgendetwas nicht?

Wenn ich per per



        private void CoverHinzufügen_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == true)
            {
                _albumImage = new BitmapImage(new Uri(ofd.FileName));
                MusicSongs mSong = (MusicSongs)ListSongs.SelectedValue;
                mSong.SongCover =  _albumImage;
            }

        }

Das Cover hinzufüge, wird es in der Gui sofort geladen.

2)
Deswegen auch meine 2te Frage, wie bekommt die Gui mit, dass ich etwas am Objekt geändert habe? Auch wenn ich in den Textboxen etwas änder, wird es sofort in die ListView übernommen.

Ich habe inotifypropertychanged nicht implementiert und eigentlich, ist dass doch ein KO Kriterium oder nicht?

Thema: [erledigt] TextBox Binding an ListViewItem Objekt
Am im Forum: GUI: WPF und XAML

Danke euch, es klappt nun mit:

 <TextBox Text="{Binding ElementName=ListSongs, Path=SelectedValue.Name}"/>

Er sagt mir nur im Designer:
Fehler
Cannot resolve propertie Name in DataContext of type object.
Irgendjemand ne ahnung warum er meckert?

Hier der relevante C# Code


 private void CmdSongsHinzufügen_OnClick(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Multiselect = true;

            if (ofd.ShowDialog() == true)
            {
                mBand = new List<MusicBand>();

                foreach (var fileName in ofd.FileNames)
                {
                    
                    using (TagLib.File file = TagLib.File.Create(fileName))
                    {
                        mBand.Add(new MusicBand(file, fileName));
                    }
                }

                ListSongs.ItemsSource = MusicSongs.MSongs;
                CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(ListSongs.ItemsSource);
                
                view.Filter = MusicFilter;
            }
        }

        private bool MusicFilter(object item)
        {
            if (String.IsNullOrEmpty(TxtFilter.Text))
                return true;
            else
                return ((item as MusicSongs).Name.IndexOf(TxtFilter.Text, StringComparison.OrdinalIgnoreCase) ≥ 0);
        }

        private void TxtFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            CollectionViewSource.GetDefaultView(ListSongs.ItemsSource).Refresh();
        }

Thema: [erledigt] TextBox Binding an ListViewItem Objekt
Am im Forum: GUI: WPF und XAML

Danke schonmal, aber
genauso hatte ich es versucht, vielleicht mache ich auch noch wo anders einen Fehler.
Die ListView hängt an einer CollectionView mit Filtermöglichkeit. Gefüttert wird die CollectionView von einer List<T> wobei T das Objekt ist.
Jemand schon erfahrung damit gemacht?

Thema: [erledigt] TextBox Binding an ListViewItem Objekt
Am im Forum: GUI: WPF und XAML

Hallo,

ich erkläre euch mal kurz mein vorhaben:

Ich habe eine ListView, diese ist an ein Objekt gebunden. Das ganze sieht so aus:


<ListView  Grid.Row="1" Grid.Column="0" MinHeight="75" Width="305" Foreground="Black" Name="ListSongs">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="210" Header="Song" DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Width="65" Header="Genre" DisplayMemberBinding="{Binding Genre}"/>
                </GridView>
            </ListView.View>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ToolTip" Value="{Binding Path=Content}"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Delete" Click="ListSongsDelete_Click"/>
                    <MenuItem Header="Play" Click="ListSongsPlay_Click"/>
                    <MenuItem Header="Stop" Click="ListSongsStop_Click"/>
                </ContextMenu>
            </ListView.ContextMenu>
        </ListView>

Nun habe ich noch mehrere Felder, die ich an das ausgewählte Objekt in der ListView binden möchte, dass heißt wenn ich ein anderes Item auswähle, werden die anderen Felder aktualisiert.
Leider habe ich seit stunden Probleme damit.

 <TextBox Text="{Binding ElementName=ListSongs, Path=<-- Hier das Objekt + Eigenschaft -->}"/>

Könnte mir von euch vielleicht jemand auf die Sprünge helfen?

Danke euch!

Thema: [Erledigt] ListboxItem Binding
Am im Forum: GUI: WPF und XAML

Vielen Dank, ich stand echt auf dem Schlauch

Thema: [Erledigt] ListboxItem Binding
Am im Forum: GUI: WPF und XAML

Hallo zusammen,

ich habe momentan Probleme die ListboxItems Dynamisch hinzuzufügen, vorzugsweise natürlich über ein Binding.


Hier mal ein Beispiel des Items, Links ist ein Bild und rechts sind ein Paar Informationen.


   <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <ListBox Name="lstItems">
            <ListBoxItem>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" Source="Breaking Bad-05.jpg" Width="80"></Image>
                    <StackPanel Grid.Column="1">
                        <Label FontSize="25" FontWeight="Bold" Foreground="Blue">Titel</Label>
                        <Label>Genres</Label>
                        <Label>Regiseure</Label>
                        <Label>Schauspieler</Label>
                    </StackPanel>
                </Grid>
            </ListBoxItem>
        </ListBox>
    </Grid>

Ist es überhaupt möglich mit einem Binding? Es sollen jetzt natürlich beliebig viele Items Dynamisch hinzugefügt werden. Ich habe es schon über die ItemSource der Listbox versucht, konnte dann aber nicht das "Design" beibehalten.

Wie würdet ihr das ganze lösen?

Danke euch

Thema: NullReferenceException beim Zugriff auf uninitialisiere Property
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

ich benutze in einem Projekt eine DLL die aus 2 Klassen besteht. In einem Fall erstellt die eine Klasse von der anderen eine Instanz, ich bekomme allerdings eine NullReferenceException wenn ich versuche mit der Klasse zu Arbeiten.

Der wichtige Teil sieht so aus:


   private void EditNamesWithBackUp(string backUpPath, params string[] options)
        {
            BackUp bu = new BackUp(); //Referenz erstellen

            int i = 0;

            Parallel.ForEach(Directory.EnumerateDirectories(DirectoryPath), dir =>
            {
                string newDirName = ChangeName(dir, i++, options);

                bu.BackUpDict.Add(dir, newDirName); //<-- Exception

Liegt es an der DLL, das ich beim erstellen etwas falsch mache, oder liegt es an etwas völlig anderem? Ich hoffe ihr könnt mir helfen :)

Danke euch :)

Thema: [erledigt] Daten aus dem Networkstream lesen
Am im Forum: Netzwerktechnologien

Achso! Jetzt wird einiges klarer, Danke!

Thema: [erledigt] Daten aus dem Networkstream lesen
Am im Forum: Netzwerktechnologien

Danke für deine Hilfe.

"Muss sogar so gemacht werden, wenn man statt einer while schleife eine do-while nimmt. "

Ich kann dir leider nicht ganz folgen, ich habe das ganze auch schon so probiert:


 while ((i = _serverStream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        allBytes.AddRange(bytes.Take(i));
                    }

leider hatte ich dieselbe Exception und i wird nie 0. Normalerweise liefert die Funktion Read aber doch 0 zurück, sobald nichts mehr im Stream steht.

Thema: [erledigt] Daten aus dem Networkstream lesen
Am im Forum: Netzwerktechnologien

Ich habe natürlich gegoogelt bevor ich hier um helfe gebeten habe.

Ich habe _serverStream.ReadTimeout = 100; auch schon auf 10 Sekunden gesetzt, es macht leider keinen Unterscheid. Außerdem teste ich momentan nur auf meinem Rechner, wo die response nicht allzu hoch sein sollte.

Es funktioniert so zwar, aber es kann ja auch nicht sein, dass es so gedacht ist, immer eine Exception zu ignorieren oder?


     while (true)
            {
                if (_serverStream.DataAvailable)
                {
                    int i = 0;
                    
                        do
                        {
                            try
                            {
                                i = _serverStream.Read(bytes, 0, bytes.Length);
                                allBytes.AddRange(bytes.Take(i));
                            }
                            catch (IOException ex)
                            {
                                var socketExept = ex.InnerException as SocketException;
                                if (socketExept == null || socketExept.ErrorCode != 10060)
                                    // if it's not the "expected" exception, let's not hide the error
                                    throw ex;
                                // if it is the receive timeout, then reading ended
                                i = 0;
                            }

                        } while (i > 0); 
                }
                else
                {
                    break;
                }
            }

Thema: [erledigt] Daten aus dem Networkstream lesen
Am im Forum: Netzwerktechnologien

Hallo zusammen,

ich sitze jetzt schon das ganze Wochenende an einem Problem und ich komme einfach nicht darauf. Ich hoffe einer von euch kann mir helfen.

Ich lese Daten aus einem Networkstream und füge sie dann einer List<byte> hinzu, dass sieh so aus: (TcpClient)


 public void ReceiveData()
        {

            _serverStream = _clientSocket.GetStream();
            _serverStream.ReadTimeout = 100;

            byte[] bytes = new byte[128];
            List<byte> allBytes = new List<byte>();

            while (true)
            {
                if (_serverStream.DataAvailable)
                {
                    int i = 0;
                    do
                    {
                        try
                        {
                            i = _serverStream.Read(bytes, 0, bytes.Length);
                            allBytes.AddRange(bytes.Take(i));
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(e.Message + " " + i);
                        }
                    } while (i > 0);
                }
                else
                {
                    break;
                }
            }

            OnMessageRecieved(new MessageRecievedEventArgs(allBytes.ToArray()));
            allBytes.Clear();

        }

Leider komme ich nie aus der inneren Schleife raus und bekomme eine IOException geworfen (Von der Übertragungsverbindung usw....).
i wird aus irgendeinem Grund nie 0.

Nun das schreiben vom Server aus.


public static void GetDrives(TcpClient client)
        {
            NetworkStream networkStream = client.GetStream();

            byte[] bytesOption = Encoding.ASCII.GetBytes("A");
            networkStream.Write(bytesOption, 0, bytesOption.Length);


            DriveInfo[] allDrives = DriveInfo.GetDrives();

            foreach (DriveInfo d in allDrives)
            {
                if (d.IsReady)
                {
                    byte[] bytes = Encoding.ASCII.GetBytes(d.RootDirectory + " " + d.VolumeLabel + " " + d.DriveFormat + " " + d.TotalSize / 1024 / 1024 + " ~ ");
                    networkStream.Write(bytes, 0, bytes.Length);
                }
            }

            networkStream.Flush();
        }

ich schreibe hier zu Testzwecken einfach meine Laufwerke zurück.

Sieht jemand meinen Fehler? Lege ich den Try Catch Block außerhalb von der Schleife, sodass rausgesprungen wird bei einer Exception funktioniert alles und alle Daten finden ihren Weg.

Danke euch :)


Edit:

  byte[] bytesOption = Encoding.ASCII.GetBytes("A");
   networkStream.Write(bytesOption, 0, bytesOption.Length);

Ich schreibe übrigens erst ein A in den Stream, damit der Client weiß wie er damit umgehen soll.
Quasi als Kommando.

Thema: Kopiervorgang Optimieren: File.Copy vs. FileStream.CopyTo
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Doch ich werde wohl auf QuickIO umsteigen, aber es hat mich interessiert, was ich falsch gemacht habe. Danke für eure Hilfe :)

Thema: Kopiervorgang Optimieren: File.Copy vs. FileStream.CopyTo
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Danke erstmal für eure Hilfe. Ich habe jetzt mal versucht die Length des Outstream fest zu setzen, dies hat aber nicht wirklich etwas gebracht. Außerdem habe ich zum Testen mal die CopyTo Methode durch manuelles Kopieren per Schleife versucht und dies hat auch keine änderung hervor gerufen.

Hier der Code:


 private static void StreamCopy()
        {

            List<DirectoryInfo> directory = Dir.EnumerateDirectories("*", SearchOption.AllDirectories).ToList();

            foreach (DirectoryInfo directoryInfo in directory)
            {
                string newDir = GetFilePath(directoryInfo.FullName);
                Directory.CreateDirectory(newDir);
            }

            List<FileInfo> files = Dir.EnumerateFiles("*", SearchOption.AllDirectories).ToList();

            int bufferSize = 1024 * 1024;
            int bytesRead = -1;
            byte[] bytes = new byte[bufferSize];

            foreach (FileInfo file in files)
            {
                using (FileStream fsIn = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    string filePath = GetFilePath(file.FullName);

                    using (FileStream fsOut = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                    {
                        fsOut.SetLength(fsIn.Length);
                       // fsIn.CopyTo(fsOut);

                        while ((bytesRead = fsIn.Read(bytes, 0, bufferSize)) > 0)
                        {
                            fsOut.Write(bytes, 0, bytesRead);
                        }
                    }
                }
            }

        }

@Abt Deine Klasse sieht wirklich interessant aus! Danke.

Könntest du mich noch kurz aufklären, warum das CopyTo Suboptimal ist?
Ich habe es mal Manuell versucht, aber es kam zu keiner änderung. Oder sollte es noch ganz anders gehen?

Edit: Sorry ich habe irgendwie deinen letzten Satz überlesen. War des setzen der Streamlänge den so gedacht? Und anstatt FileInfo , was sollte ich denn verwenden?

Thema: Kopiervorgang Optimieren: File.Copy vs. FileStream.CopyTo
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

ich habe des öfteren gelesen, dass das Kopieren per Filestream schneller sein soll, als File.Copy().

Da ich in einigen Programmen Daten kopiere, wollte ich mir das mal genauer ansehen, aber bei mir ist genau das Gegenteil der Fall.

Mit vielen kleinen Dateien:
File.Copy --> 18s
Stream --> 50s

Mit einer großen Datei:
File.Copy --> 1.32 min
Stream --> 1.38min

Ich befürchte das es daran liegt, dass mein Code äußerst bescheiden ist.

Hier mal der Code zum Testen, den Methodenaufruf habe ich dann natürlich ausgetauscht.


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace CopyTest
{
    class Program
    {
        private const string fromDirectory = @"M:\Anderes\Games\Mirrors Edge\";
        private const string toDirectory = @"F:\";

        private static DirectoryInfo Dir = new DirectoryInfo(fromDirectory);
        static void Main(string[] args)
        {
            Console.WriteLine("START");
            Stopwatch sp = new Stopwatch();
            sp.Start();
            StreamCopy();
            sp.Stop();

            Console.WriteLine(sp.Elapsed.TotalMinutes);
            Console.ReadKey();
        }

        private static void StreamCopy()
        {

            List<DirectoryInfo> directory = Dir.EnumerateDirectories("*", SearchOption.AllDirectories).ToList();

            foreach (DirectoryInfo directoryInfo in directory)
            {
                string newDir = GetFilePath(directoryInfo.FullName);
                Directory.CreateDirectory(newDir);
            }

            List<FileInfo> files = Dir.EnumerateFiles("*", SearchOption.AllDirectories).ToList();

            foreach (FileInfo file in files)
            {
                using (FileStream fsIn = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    string filePath = GetFilePath(file.FullName);

                    using (FileStream fsOut = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                    {
                        fsIn.CopyTo(fsOut);
                    }
                }
            }

        }

        private static void FileCopy()
        {
            List<DirectoryInfo> directory = Dir.EnumerateDirectories("*", SearchOption.AllDirectories).ToList();

            foreach (DirectoryInfo directoryInfo in directory)
            {
                string newDir = GetFilePath(directoryInfo.FullName);
                Directory.CreateDirectory(newDir);
            }

            List<FileInfo> files = Dir.EnumerateFiles("*", SearchOption.AllDirectories).ToList();

            foreach (FileInfo file in files)
            {
                string filePath = GetFilePath(file.FullName);
                File.Copy(file.FullName, filePath);
            }
        }

        private static string GetFilePath(string filepath)
        {
            string newPath = String.Concat(toDirectory, filepath.Substring(fromDirectory.Length, filepath.Length - fromDirectory.Length));
            return newPath;
        }

    }
}

Könnte vielleicht mal jemand auf meinen Test schauen und meinen Kopiervorgang optimieren?

Das wäre sehr nett.

Danke :)

Thema: Unterschied zwischen ComboBox.SelectedItem und .Text in Abhängigkeit vom DropDownStyle
Am im Forum: GUI: Windows-Forms

Danke für deine Antowort! Das ist auf jeden Fall nachvollziehbar!

Thema: Unterschied zwischen ComboBox.SelectedItem und .Text in Abhängigkeit vom DropDownStyle
Am im Forum: GUI: Windows-Forms

Hallo,

ich habe mit der C# Programmierung gerade erst angefangen und sofort auch schon eine Frage.
Ich lese momentan das Buch: Einstieg in Visual C# 2012.
Dort wird gesagt, dass eine DropDownList Combobox über die Eigenschaft SelectedItem angesprochen wird, z.B. beim Ausgeben:
lblAuswahl2.Text = "Auswahl: " + cmbWerkzeug2.SelectedItem;

Comboboxen mit dem DropDownStyle "Simple" oder "DropDown", sollen über cmbWerkzeug3.Text; angesprochen werden.

Allerdings funktionieren beide Funktionen bei jeder Combobox ohne Probleme.

Wo also ist der Sinn?

Ich hoffe mir kann das jemand erklären :)

Danke!