2010-12-14 18 views
0

J'ai une liste déroulante qui contient 5 éléments. J'ai une étiquette sur la fenêtre. Ce que je voudrais faire est quand un utilisateur clique sur l'un des éléments de la liste déroulante, le texte remplira cette étiquette. Je souhaite afficher des informations sur l'élément sélectionné (adresse IP, etc.). Toute aide est appréciée. Merci.Question sur la liste déroulante et les étiquettes

code:

private void cmbGroups_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    //Combo box selection changed. Re-bind data 
    string selectedGroup = (string)cmbGroups.SelectedItem; 
    BindGrid(selectedGroup); 
} 

code:

private void BindGrid(string selectedGroup) 
    { 
     //Re-bind the grid 
     dgPortStatus.DataContext = _dicPortStatus[selectedGroup].Portstatus.DefaultView; 

     InitializeColumns(); 
    } 

code:

private void _UpdatePortStatus() 
    { 
     string[] files = Directory.GetFiles(System.Configuration.ConfigurationSettings.AppSettings["portStatusDir"], "PortStatus.*"); 

     foreach (string file in files) 
     { 

      PortStatus ps = new PortStatus(); 
      ps.ReadXml(new StreamReader(file)); 
      //ps.ReadXml(new FileStream(file, FileMode.Open, FileAccess.Read)); 

      if (!_dicPortStatus.ContainsKey(ps.General[0].Group)) 
      { 
       _dicPortStatus.Add(ps.General[0].Group, ps); 
      } 

      PortStatus psOrig = _dicPortStatus[ps.General[0].Group]; 

      foreach (PortStatus.PortstatusRow psr in ps.Portstatus.Rows) 
      { 
       DataRow[] drs = psOrig.Portstatus.Select("PortNumber = '" + psr.PortNumber + "'"); 

       if (drs.Length == 1) 
       { 
        DateTime curDt = DateTime.Parse(drs[0]["LastUpdateDateTimeUTC"].ToString()); 
        DateTime newDt = psr.LastUpdateDateTimeUTC; 

        if (newDt > curDt) 
        { 
         drs[0]["LastUpdateDateTimeUTC"] = newDt; 
        } 
       } 
       else if (drs.Length == 0) 
       { 
        psOrig.Portstatus.ImportRow(psr); 
       } 
       else 
       { 
        throw new Exception("More than one of the same portnumber on PortStatus file: " + file); 
       } 
      } 
     } 

     foreach (string groupName in _dicPortStatus.Keys) 
     { 
      if (!cmbGroups.Items.Contains(groupName)) 
      { 
       cmbGroups.Items.Add(groupName); 
       cmbGroups.SelectedItem = groupName; 
      } 
     } 

code:

private Dictionary<string, PortStatus> _dicPortStatus = new Dictionary<string, PortStatus>() 
+0

Est-ce WinForms, WPF ??? –

+0

Je travaille sur un projet WPF –

+0

J'ai ajouté un tag wpf à votre question. Ajouter les bonnes balises à vos questions aidera les gens à répondre plus précisément et à attirer les personnes qui s'intéressent à ces balises. à votre santé. –

Répondre

2
<ComboBox Name="ComboBox1"> 
... 
<ComboBox /> 

<Label Text="{Binding ElementName=ComboBox1, Path=SelectedItem}" /> 

--EDIT--

Exemple étendu:

<StackPanel> 
     <ComboBox Name="ComboBox1" 
        DisplayMemberPath="FirstName"></ComboBox> 
     <StackPanel DataContext="{Binding ElementName=ComboBox1, Path=SelectedValue}"> 
      <Label Content="{Binding FirstName}" /> 
      <Label Content="{Binding LastName}" /> 
      <Label Content="{Binding Age}" /> 
     </StackPanel> 
    </StackPanel> 

la morue e:

 InitializeComponent(); 

     ObservableCollection<Person> persons = new ObservableCollection<Person>() { 
      new Person(){ FirstName = "John", LastName = "Doe", Age = 25 }, 
      new Person(){ FirstName = "John", LastName = "Smith", Age = 35 }, 
      new Person(){ FirstName = "Susan", LastName = "Smith", Age = 31 }, 
      new Person(){ FirstName = "Anthony", LastName = "Jones", Age = 31 }, 
     }; 

     ComboBox1.ItemsSource = persons; 

Classe:

public class Person 
{ 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 
    public Int32 Age { get; set; } 
} 

--edit: 2--

Créer une nouvelle classe:

class GroupInfo 
{ 
    public String GroupName { get; set; } 
    public String IP { get; set; } 
} 

et modifiez votre code suivant:

foreach (string groupName in _dicPortStatus.Keys) 
    { 
     if (!cmbGroups.Items.Contains(groupName)) 
     { 
      cmbGroups.Items.Add(new GroupInfo(){ GroupName = groupName, IP = <Write Code to get IP>); 
      cmbGroups.SelectedItem = groupName; 
     } 
    } 

changement XAML à suivre:

<ComboBox Name="ComboBox1" DisplayMemberPath="GroupName"> 
    ... 
<ComboBox /> 

<Label Text="{Binding ElementName=ComboBox1, Path=SelectedItem.IP}" /> 
+0

Comment définir ce que chaque élément sélectionné doit afficher? –

+0

Vous pouvez utiliser 'Path = SelectedItem.PropertyName' – decyclone

+0

Est-ce que cela fonctionnera pour remplir une étiquette sur le formulaire avec des informations sur n'importe quel élément que je sélectionne dans la liste déroulante? –

-1

Salut, vous pouvez essayer quelque chose comme ça

private void ComboBox1_SelectedIndexChanged(object sender, 
    System.EventArgs e) 
{ 

    ComboBox comboBox = (ComboBox) sender; 

    string myItemText = (string) ComboBox1.SelectedItem; 

    // populate 
    MyTextBox.Text = myItemText; 

} 
+0

Si cela répond à votre question, veuillez la marquer comme la réponse acceptée, en cliquant sur la coche à gauche de la question. :) –

+0

Donc, si je le faisais de cette façon, comment définirais-je ce que chaque élément serait listé dans l'étiquette? –

2

dans Win Forms:

comboBox.SelectedIndexChanged += onSelectedIndexChanged; 

private void onSelectedIndexChanged(object sender, EventArgs e) 
{ 
    object item = comboBox.SelectedItem; 
    string text = //get text from item 
    label.Text = text; 
} 
+0

Chaque élément sélectionné affichera un texte différent. Existe-t-il un moyen de faire cela et de faire en sorte que chaque article affiche quelque chose de différent? –

+0

@Joe: au lieu de '// get text from item' vous devez appeler une fonction pour obtenir un texte spécifique pour' item'. Mais cela ne vous aidera pas puisque vous êtes intéressé par Wpf. –