【问题标题】:comboBox with data from database and DataGrid in tabControl (xaml wpf C# Oracle DB)在 tabControl 中包含来自数据库和 DataGrid 的数据的组合框(xaml wpf C# Oracle DB)
【发布时间】:2017-08-27 15:58:27
【问题描述】:

我在 tabControl 中有来自数据库和 DataGrid 的数据的组合框。

一切正常。 我在 tabItem_1 上的 comboBox_1 中选择了一些东西(DataGrid_1 从 DB 中显示表作为我对 ComboBox_1 的选择值)并切换到 tabItem_2 并在 comboBox_2 中选择一些东西(DataGrid_2 从 DB 中显示表作为我对 ComboBox_2 的选择值)

但是当我回到 TabItem_1 时,TabItem_1 出现错误:

对象引用未设置为对象实例

当我单击“确定”时,一切正常。 我该如何解决?

XAML 代码:

 <TabItem Background="Bisque" ToolTip="W tym oknie możesz przeglądnąć historię wypożyczeń danej ksiązki, wybierz z ComboBoxa pozycje i przycisk kliknij wczytaj">
                <TabItem.Header>
                    <StackPanel Orientation="Horizontal" >
                        <TextBlock Text="Historia książęk"  FontSize="16" />
                    </StackPanel>
                </TabItem.Header>
                <StackPanel>
                    <ComboBox x:Name="cBox_hisBooks"  HorizontalAlignment="Center" Margin="5" VerticalAlignment="Top" Width="300"  ToolTip="Rozwiń liste i wybierz książkę, której historie wypożyczeń chcesz wyświetlić" IsEnabled="True" Loaded ="cBox_hisBooks_Loaded" SelectionChanged="cBox_hisBooks_SelectionChanged"/>
                    <!-- DisplayMemberPath="HISTORies"-->
                    <DataGrid x:Name="dg_hisBooks" AutoGenerateColumns="False" VerticalAlignment="Center" Height="400"  ToolTip="Podgląd bazy danych z ewidencja czytelników wypożyczeń, aby odświeżyć naciśnij przycisk poniżej" Loaded="dg_hisBooks_Loaded" SelectionChanged="dg_hisBooks_SelectionChanged" Margin="10,5">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="ID czytelnika" Binding="{Binding USER.USERID}"/>
                            <DataGridTextColumn Header="Imię czytelnika" Binding="{Binding USER.FIRSTNAME}"/>

CS 代码:

private void cBox_hisBooks_Loaded(object sender, RoutedEventArgs e)      // ok 
        {
            try         // próba połaczenia z baza Oracle
            {
                List<BOOK> books = new List<BOOK>();
                using (EntitiesDBTest db = new EntitiesDBTest())
                {
                    books = db.BOOKS.OrderBy(b => b.TITLE).ToList();
                }

                var combo_HB = sender as ComboBox; // zmienna przyjmujaca wartosc z ComboBoxa
                combo_HB.ItemsSource = books;       // zrodlo opcji do wyboru
                combo_HB.DisplayMemberPath = "GetTitleWithAuthor";
                combo_HB.SelectedValuePath = "BOOKID";
                // combo_HB.SelectedIndex = 1;        // domyslnie wybrana opcja (domyslnie 0 czyli pierwsza)

                con.Close(); // zamkniecie bazy danych

            }
            catch (Exception Ex)
            {
                MessageBox.Show("Błąd ładowania listy comboBoxa w historii książek\n " + Ex.Message, "Error 1", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

    private void cBox_hisBooks_SelectionChanged(object sender, SelectionChangedEventArgs e) // ok
    {
        var selected_cBox_his_book_Item = sender as ComboBox; // przyjmuje wartosc z ComboBoxa
        choiceBook_his = (int)selected_cBox_his_book_Item.SelectedValue; 
if (choiceBook_his == 0)
    MessageBox.Show("Aktualne pole ComboBox ma wartosc -1 lub 0\nWybierz wartośc z listy");}

【问题讨论】:

    标签: wpf xaml combobox datagrid tabcontrol


    【解决方案1】:

    每次更改所选选项卡时都会调用 Loaded。 因此,您需要在第二次调用 Loaded 处理程序方法时检查谁为 null。

    【讨论】:

    • 当我使用按钮加载该choiceBook_his = 0。我尝试使用if (choiceUser_his == null) combo.SelectedIndex = 1; ,但它不起作用。
    • 您是否尝试在 Loaded 方法中放置断点?当你第二次到达那里时,看看谁是空的?
    • 我的方法"dg_hisBooks_Loaded" 是空的。单击按钮 Load 时我会刷新 DataGrid 是否可以关闭已更改的 selectet 选项卡的加载?
    • 当我设置断点时我方法btn_hisBooks_Loaded我没有null但是当我检查cBox_hisUsers_Loadedcombo.ItemsSource = users;users有null
    • 最后我删除了这个 tabItem 并将 dataGrid 和 ComboBox 放到新窗口中。现在我没有任何错误。
    猜你喜欢
    • 2018-12-09
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多