Ik ben weer aan het stoeien met LINQ en ik probeer een combobox te vullen via LINQ en als de selectie is gewijzigd dat de gegevens van de selectie in labels wordt getoond.
Allemaal niet zo heel spannend
Hier de code om te combobox te vullen:
Bovenstaande code werkt zoals bedoeld.
Het gaat mis bij het opvragen van SelectedItem:
selectedLayerItem.LayerHandle bestaat niet. Als ik selectedLayerItem in QuickWatch bekijk, zie ik:
{LayerHandle=9, Name="test", LayerType="Point"}
Dus de properties zijn wel bekend. Maar ik denk dat ze niet benaderbaar zijn op de manier dat ik doe, omdat ze Anonymous zijn.
Hoe moet ik dat dan wel doen?
Via Google kwam ik op veel voorbeelden waar een aparte classe wordt gebruikt:
SelectedIndexChanged wordt dan:
Dat werkt wel.
Nu is mijn vraag wat is de beste manier om dit op te lossen? Omdat cboLayers.SelectedItem wel alle info lijkt te hebben, lijkt het me wat overbodig om een extra classe te gebruiken.
Verder gebruik ik .ToArray() in de DataSource. In voorbeelden zie ik ook vaak .ToList(). Welke kan ik het beste gebruiken?
Allemaal niet zo heel spannend
Hier de code om te combobox te vullen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public void fillVisibleLayers(frmLayers frm) { var visibleLayers = from l in Layers.Cast<Layer>() where l.Visible == true orderby l.GlobalPosition descending select new { Name = l.Name , LayerHandle = l.Handle , LayerType = l.LayerType }; frm.cboLayers.DataSource = visibleLayers.ToArray(); frm.cboLayers.DisplayMember = "Name"; frm.cboLayers.ValueMember = "LayerHandle"; frm.cboLayers.SelectedValue = _mapWin.Layers.CurrentLayer; } |
Bovenstaande code werkt zoals bedoeld.
Het gaat mis bij het opvragen van SelectedItem:
C#:
1
2
3
4
5
6
7
8
9
10
11
| private void cboLayers_SelectedIndexChanged(object sender, EventArgs e) { //Get data from combobox var selectedLayerItem = cboLayers.SelectedItem; if (selectedLayerItem != null) { lblHandle.Text = "Handle: " + selectedLayerItem.LayerHandle.ToString(); lblName.Text = "Name: " + selectedLayerItem.Name.ToString(); lblType.Text = "Type: " + selectedLayerItem.LayerType.ToString(); } } |
selectedLayerItem.LayerHandle bestaat niet. Als ik selectedLayerItem in QuickWatch bekijk, zie ik:
{LayerHandle=9, Name="test", LayerType="Point"}
Dus de properties zijn wel bekend. Maar ik denk dat ze niet benaderbaar zijn op de manier dat ik doe, omdat ze Anonymous zijn.
Hoe moet ik dat dan wel doen?
Via Google kwam ik op veel voorbeelden waar een aparte classe wordt gebruikt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public class MyLayersList { public string Name { get; set; } public int LayerHandle { get; set; } public eLayerType LayerType { get; set; } // This is neccessary because the ListBox and ComboBox rely // on this method when determining the text to display. public override string ToString() { return Name; } } |
SelectedIndexChanged wordt dan:
C#:
1
2
3
4
5
6
7
8
9
10
11
| private void cboLayers_SelectedIndexChanged(object sender, EventArgs e) { //Get data from combobox var selectedLayerItem = (MyLayersList)cboLayers.SelectedItem; if (selectedLayerItem != null) { lblHandle.Text = "Handle: " + selectedLayerItem.LayerHandle.ToString(); lblName.Text = "Name: " + selectedLayerItem.Name.ToString(); lblType.Text = "Type: " + selectedLayerItem.LayerType.ToString(); } } |
Dat werkt wel.
Nu is mijn vraag wat is de beste manier om dit op te lossen? Omdat cboLayers.SelectedItem wel alle info lijkt te hebben, lijkt het me wat overbodig om een extra classe te gebruiken.
Verder gebruik ik .ToArray() in de DataSource. In voorbeelden zie ik ook vaak .ToList(). Welke kan ik het beste gebruiken?