WPF:C#如何获取Listbox的选定值?

时间:2014-09-02 09:50:24

标签: c# wpf listbox

我正在尝试获取列表框的选定值。当我实际尝试LstGroup1.SelectedItem时,我得到值{ BoothID = "4", BoothName = "HP" },即使我尝试从LstGroup1.SelectedValue获取值,输出也是相同的。现在我想获取BoothID,即预期输出为4,但我无法获取。{/ p>

我的ListBox名称为LstGroup1

public List<object> BoothsInGroup1 { get; set; }
// Inside the Constructor 
BoothsInGroup1 = new List<object>();
//After Fetching the value add 
BoothsInGroup1.Add(new { BoothID = da["BoothID"].ToString(), BoothName = da["BoothName"].ToString() });

//Now here I get 
var Booth = (LstGroup1.SelectedItem);
//Output is { BoothID = "4", BoothName = "HP" }

// Expected Output 4

建议我怎么做。


修改

public partial class VotingPanel : Window
{
    public List<object> BoothsInGroup1 { get; set; }
    public VotingPanel()
    {
        InitializeComponent();
        DataContext = this;
        BoothsInGroup1 = new List<object>();

        //Connection is done
        SqlConnection con = new SqlConnection(ConnectionString);
        con.Open();

        FieldNameCmd.CommandText = "SELECT * FROM Booth b, BoothGroup bg where bg.GroupID=b.GroupID;";
        IDataReader da = FieldNameCmd.ExecuteReader();
        while (da.Read())
        {
            if (Group1Name.Text == da["GroupName"].ToString())
            { // Adds value to BoothsInGroup1
                BoothsInGroup1.Add(new { BoothID = da["BoothID"].ToString(), BoothName = da["BoothName"].ToString() });
            }
        }
    }
    private void BtnVote_Click(object sender, RoutedEventArgs e) // on Click wanted to find the value of Selected list box
    {   
        if (LstGroup1.SelectedIndex >= 0 && LstGroup2.SelectedIndex >= 0)
        {
            var Booth = (LstGroup1.SelectedItem);
            //Few things to do 
        }
    }
}

XAML

<ListBox Grid.Row="1"
         Name="LstGroup1"
         ItemsSource="{Binding BoothsInGroup1}"
         Margin="5,1">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding BoothID}"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Bottom"
                           FontSize="15"
                           FontWeight="ExtraBold"
                           Margin="5,3"
                           Grid.Column="1" />
                <TextBlock Text="{Binding BoothName}"
                           Grid.Column="1"
                           VerticalAlignment="Center"
                           FontWeight="ExtraBold"
                           FontSize="30"
                           Margin="15" />

            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

5 个答案:

答案 0 :(得分:5)

因为您使用匿名类型来填充列表框,所以您没有选项,而是object类型以将SelectedItem强制转换为。其他方法可能包括反射以提取字段/属性值。

但如果您使用的是C#4或更高版本,则可以使用dynamic

    if (LstGroup1.SelectedIndex >= 0 && LstGroup2.SelectedIndex >= 0)
    {
        //use dynamic as type to cast your anonymous object to
        dynamic Booth = LstGroup1.SelectedItem as dynamic;
        //Few things to do 

        //you may use the above variable as
        string BoothID = Booth.BoothID;
        string BoothName = Booth.BoothName:

    }

这可能会解决您当前的问题,但出于多种原因,我建议为此创建一个类。

答案 1 :(得分:1)

你试过了吗?

var Booth = (LstGroup1.SelectedItem);
string ID=Booth.BoothID;
string Name=Booth.BoothName:

答案 2 :(得分:1)

我认为,您应该尝试以下方法之一://编辑:如果Booth是类/结构

,此解决方案才有效
var myBooth = LstGroup1.SelectedItem as Booth;
String id =myBooth.BoothID;
String name=myBooth.BoothName:

或使用不同类型的通用列表:

public List<Booth> BoothsInGroup1 { get; set; }
....
var myBooth = LstGroup1.SelectedItem;
String id =myBooth.BoothID;
Stringname=myBooth.BoothName:

如果Booth还不是一个类,请添加一个新类:

public class Booth
{
    public int BoothID { get; set; }
    public String BoothName { get; set; }
}

所以你可以在你的通用列表中使用它,你可以在数据库读取之后填写它

BoothsInGroup1.Add(new Booth
   { 
     BoothID = Convert.ToInt32(da["BoothID"]),
     BoothName = da["BoothName"].ToString() 
   });

答案 3 :(得分:1)

您始终可以创建一个名为Booth的类来获取对象格式的数据。从我的观点来看,动态不是正确的做法。一旦在解决方案中有了类展位,就可以运行

Booth Booth1 = LstGroup1.SelectedItem as Booth;
string BoothID1 = Booth1.BoothID;

答案 4 :(得分:0)

public List<object> BoothsInGroup1 { get; set; }

BoothsInGroup1 = new List<object>();

BoothsInGroup1.Add(new { BoothID = da["BoothID"].ToString(), BoothName = da["BoothName"].ToString() });


var Booth = (LstGroup1.SelectedItem);
var output = Booth.BoothID;