簡體   English   中英

WPF:C#如何獲取列表框的選定值?

[英]WPF: C# How to get selected value of Listbox?

我正在嘗試獲取列表框的選定值。 當我實際嘗試LstGroup1.SelectedItem時,我得到了值{ BoothID = "4", BoothName = "HP" } ,即使我嘗試從LstGroup1.SelectedValue獲取值,輸出也是相同的。 現在我想獲取BoothID即預期的輸出是4但我無法得到。

我的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>

由於您使用匿名類型填充列表框,因此您別無選擇,而是將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:

    }

這可能會解決您當前的問題,但是出於許多原因,我建議出於同樣的原因創建一個類。

你有沒有嘗試過 :

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

我認為,您應該嘗試以下操作之一://編輯:僅當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() 
   });

您始終可以創建一個名為Booth的類來獲取對象格式的數據。 從我的角度來看, 動態不是正確的方法。 解決方案中有班級攤位后,即可運行

Booth Booth1 = LstGroup1.SelectedItem as Booth;
string BoothID1 = Booth1.BoothID;
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;

對於那些知道他們想要的類型或對象的人來說,代碼如下所示:

private void lboxAccountList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
      //Class object = (Class)listName.SelectedItem;
      // object.getName or object.getSomeVariable or object.callMethod(object.getName)

      Account account  = (Account)lboxAccountList.SelectedItem;
      MessageBox.Show(""+account.AccountNo+" "+account.Balance);          
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM