Обновление с * нового * текста ComboBox, а не старого текста - PullRequest
0 голосов
/ 09 мая 2019

У меня есть выпадающий список, из которого я выбираю значение. Я хочу использовать вновь выбранное значение в комбинированном ящике в качестве сравнения с моей базой данных, но я смог вернуть только то значение, которое совпадает с текстом, который был в комбинированном ящике до изменения выбора.

Я пытался изменить .text на выбранный элемент и выбранное значение, ни один из которых не возвращает выбор вообще.

Это вызывается при изменении выбора ComboBox:

    private void StationComboBox_1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        GetIP();
    }

    private void GetIP()
    {
        string connectionString = "SERVER=localhost;DATABASE=db; UID=PC;Password=pw;";

        MySqlConnection connection = new MySqlConnection(connectionString);

        MySqlCommand cmd = new MySqlCommand("SELECT IP_stations from stations WHERE stationNumber_stations='" + stationComboBox_1.Text + "'", connection); 
        connection.Open();

        string IP = (string)cmd.ExecuteScalar();


        DisplayIP.Text = IP;

Это код из этого ComboBox, который получает свои значения из той же базы данных, но из другой таблицы.

<ComboBox 
    Grid.Column="1" 
    x:Name="stationComboBox_1" 
    FontSize="25" 
    Width="60" 
    HorizontalAlignment="Left" 
    DisplayMemberPath="stationNumber_stations" 
    ItemsSource="{Binding}" 
    Text="0" 
    SelectionChanged="StationComboBox_1_SelectionChanged"
    />

DisplayIP Xaml:

<TextBox x:Name="DisplayIP"/>

Настройка ComboBox:

        public void SQLSetup()
        {
            string connectionString = "SERVER=localhost;DATABASE=db; UID=PC;Password=pw;"; 

            MySqlConnection connection = new MySqlConnection(connectionString); 

            MySqlCommand cmd = new MySqlCommand("Select stationNumber_stations from stations", connection); //Command to select all the station numbers
            connection.Open();


            DataTable dt = new DataTable(); //Creates a new data table
            dt.Load(cmd.ExecuteReader()); //Loads the data table with the values returned from the MySQL command
            connection.Close(); //Closes the MySQL connection

            //Sets the values in the station dropdowns to the values from the data table with the station numbers
            stationComboBox_1.DataContext = stationComboBox_2.DataContext = stationComboBox_3.DataContext = stationComboBox_4.DataContext = stationComboBox_5.DataContext =
                stationComboBox_6.DataContext = stationComboBox_7.DataContext = stationComboBox_8.DataContext = dt;
            stationComboBox_1.ItemsSource = stationComboBox_2.ItemsSource = stationComboBox_3.ItemsSource = stationComboBox_4.ItemsSource = stationComboBox_5.ItemsSource =
                stationComboBox_6.ItemsSource = stationComboBox_7.ItemsSource = stationComboBox_8.ItemsSource = dt.DefaultView;


            //sets an int to the value selected in the station dropdown
            string stationSelection_1 = stationComboBox_1.Text;
            string stationSelection_2 = stationComboBox_2.Text;
            string stationSelection_3 = stationComboBox_3.Text;
            string stationSelection_4 = stationComboBox_4.Text;
            string stationSelection_5 = stationComboBox_5.Text;
            string stationSelection_6 = stationComboBox_6.Text;
            string stationSelection_7 = stationComboBox_7.Text;
            string stationSelection_8 = stationComboBox_8.Text;
        }

Я хочу, чтобы текстовое поле DisplayIP отображало IP-адрес текущего выделения. Тем не менее, он отображает IP предыдущего выбора.

Прямо сейчас при запуске оба поля ComboBox и TextBox пусты. Я выбираю станцию ​​в ComboBox и TextBox остается пустым. Когда я выбираю новую станцию ​​в ComboBox, TextBox обновляется и отображает IP-адрес первого выбора.

1 Ответ

1 голос
/ 09 мая 2019

Похоже, когда вы изменяете выбор в ComboBox, вы хотите, чтобы в текстовом поле отображался IP-адрес выбранной станции. Мы знаем, что это в столбце IP_stations в таблице станций.

Мы уже обсуждали тот факт, что ItemsSource="{Binding}" является избыточным, поэтому я опускаю это. Я опускаю обработчик, изменяющий выбор, потому что эта работа будет выполняться привязкой. Нет необходимости повторно запрашивать базу данных при изменении выбора, потому что у нас уже есть все столбцы всех строк в DataView, отображаемых в выпадающем списке.

Вы уже выучили DisplayMemberPath, и мы будем использовать его злого близнеца SelectedValuePath.

SelectedValuePath="IPStations" сообщает комбинированному списку, что при изменении выделения он должен посмотреть на выбранный элемент (в данном случае DataRowView из DataView) и попытаться найти свойство или столбец (в нашем случае столбец) по этому название. Если он найдет его, ComboBox назначит значение этого столбца своему собственному свойству SelectedValue. Затем мы учим текстовое поле обновляться, привязывая его свойство Text к stationComboBox_1.SelectedValue.

Чтобы это работало, вам нужно выбрать оба значения из таблицы (я пренебрег этим в первый раз):

//Command to select all the station numbers and IPs
MySqlCommand cmd = 
    new MySqlCommand("Select stationNumber_stations, IP_stations from stations", 
        connection); 

Готово.

<ComboBox 
    Grid.Column="1" 
    x:Name="stationComboBox_1" 
    Width="60" 
    HorizontalAlignment="Left" 
    DisplayMemberPath="stationNumber_stations" 
    SelectedValuePath="IP_stations"
    />
<TextBox
    Text="{Binding SelectedValue, ElementName=stationComboBox_1}" 
    />

ComboBox.Text используется только в WPF в тех случаях, когда текст комбинированного списка является редактируемым.

Кстати, вот что вы могли бы сделать в обработчике изменения выбора:

private void stationComboBox_1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var cb = (sender as ComboBox);

    //  If SelectedValuePath is "IP_Stations", this will be the IP address. 
    //  It will be the correct current selected value. 
    var selectedValue = cb.SelectedValue;

    //  Alternatively, we could do it this way:
    var row = cb.SelectedItem as DataRowView;

    if (row != null)
    {
        var selectedIP = row["IP_stations"];
    }
}

Следующая проблема, по крайней мере, на мой взгляд, заключается в том, что вы копируете и вставляете все восемь раз. MVVM может вывести вас из этого беспорядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...