Сетки данных и привязки данных

#c# #wpf #xaml #data-binding #wpfdatagrid

#c# #wpf #xaml #привязка данных #wpfdatagrid

Вопрос:

Я использую C # и XAML для создания диалогового окна, в котором отображается информация из базы данных. Окно, более или менее, функционирует так, как должно. При инициализации данные базы данных заполняются DataGrid соответствующим образом.

введите описание изображения здесь

Как вы можете видеть, существует также ComboBox который предназначен для фильтрации содержимого DataGrid . Это вроде как делает это. Когда я выбираю нужный элемент из ComboBox , он фильтрует мою базу данных и создает List<> выбранные типы объектов со всеми их данными. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ заполнить временную таблицу данными из List<> для заполнения DataGrid . В итоге происходит следующее:

введите описание изображения здесь

В базе данных есть правильное количество строк для элементов, и когда я запускаю ее с перерывом, и все правильные данные находятся в List<> ; но данные не отображаются в строках.

Я не могу создать новую таблицу в базе данных для результатов, потому что тогда привязки данных для DataGrid не будут работать; Я попытался повторно заполнить таблицу информацией из List<> через вспомогательные классы… Не могу в этом разобраться.

Любые идеи и / или помощь были бы великолепны.

Вот примерно столько кода, сколько я могу опубликовать: Привязки данных XML (путь привязки соответствует столбцам в базе данных):

 <DataGridTextColumn Header="Size" Binding="{Binding Path=ItemSize }"/>
<DataGridTextColumn Header="Elbow" Binding="{Binding Path=Ell}"/>
<DataGridTextColumn Header="Tee" Binding="{Binding Path=Tee}"/>
<DataGridTextColumn Header="Long-Turn Elbow" Binding="{Binding Path=LngEl}"/>
<DataGridTextColumn Header="Check Valve" Binding="{Binding Path=Chk}"/>
<DataGridTextColumn Header="Butterfly Valve" Binding="{Binding Path=Bfy}"/>
<DataGridTextColumn Header="Gate Valve" Binding="{Binding Path=Gate}"/>
<DataGridTextColumn Header="Alarm Valve" Binding="{Binding Path=Alm}"/>
<DataGridTextColumn Header="Dry Pipe Valve" Binding="{Binding Path=DPV}"/>
<DataGridTextColumn Header="45⁰ Elbow" Binding="{Binding Path=45Ell}"/>
<DataGridTextColumn Header="Tee Run" Binding="{Binding Path=Teerun}"/>
<DataGridTextColumn Header="Coupling" Binding="{Binding Path=Coup}"/>
<DataGridTextColumn Header="Swing Check" Binding="{Binding Path=Swg}"/>
  

C#:

 var newTable = new CEqlTable();

var results = from myRow in vTable.AsEnumerable()
              where myRow.SubCategoryID == GetPipeNumber()
              select myRow;

foreach (DataRow dr in results)
{
     var nextEntry = new CEqlTableRec(
         false, (int)dr[0], (int)dr[1], (double)dr[2], (double)dr[3],
         (double)dr[4], (double)dr[5], (double)dr[6], (double)dr[7],
         (double)dr[8], (double)dr[9], (double)dr[10], (double)dr[11],
         (double)dr[12], (double)dr[13], (double)dr[14], (double)dr[15],
         Convert.ToByte(dr[18]));

    newTable.Add(nextEntry);
}

dgPipeDetail.ItemsSource = newTable;
  

Комментарии:

1. Пожалуйста, опубликуйте какую-нибудь полезную часть вашего кода на xaml и C #. Без кода трудно сказать, что не так.

2. Привет, Массимилиано, я обновил сообщение, добавив столько кода, сколько смог.

3. Новая таблица — это не отфильтрованные результаты? Или NewTable — это отфильтрованные результаты?

4. Новая таблица предназначена для отфильтрованных результатов. Однако не позволяйте имени класса ввести вас в заблуждение. Это не создает таблицу. Он возвращает список<>

5. Не могли бы вы, пожалуйста, опубликовать также код инициализации для новой таблицы? Я имею в виду, при первом заполнении. Поскольку в первый раз все в порядке, а в «отфильтрованные» времена — нет, возможно, между ними есть какая-то разница.

Ответ №1:

Так и не получил достаточно информации, чтобы диагностировать проблему, но ниже я опубликовал очень простой пример привязки к коллекции в коде позади. Я также разместил кнопку в главном окне. При нажатии кнопки я очищаю предыдущие данные и заполняю datagrid новыми данными. Сравните то, что у меня есть ниже, с тем, что есть у вас. Посмотрим, подскажет ли это вам какие-нибудь идеи.

MainWindow.xaml

 <Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" 
        Height="350" 
        Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <DataGrid ItemsSource="{Binding Classes}"
              CanUserAddRows="False"
              AutoGenerateColumns="False"
              Margin="0,0,220,0.5">
        <DataGrid.Columns>
           <DataGridTextColumn Header="FIRST" Binding="{Binding First}"/>
           <DataGridTextColumn Header="SECOND" Binding="{Binding Second}"/>
           <DataGridTextColumn Header="THIRD" Binding="{Binding Third}"/>
           <DataGridTextColumn Header="FOURTH" Binding="{Binding Fourth}"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Swap" 
            HorizontalAlignment="Left" 
            Margin="400,70,0,0" 
            VerticalAlignment="Top" 
            Width="75"
            Command="{Binding SwapCommand}"/>
</Grid>
  

MainWindow.xaml.cs

 namespace DataGridTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            SwapCommand = new RelayCommand(OnExecuteSwap);

            InitializeComponent();

            for(int i = 0; i < 10; i  )
            {
                Classes.Add(
                    new MyClass
                    {
                        First = 10,
                        Second = 20,
                        Third = 30,
                        Fourth = 40
                    });
            }
        }

        private void OnExecuteSwap()
        {
            Classes.Clear();

            for(int i = 0; i < 10; i  )
            {
                Classes.Add(
                    new MyClass
                    {
                        First = 50,
                        Second = 60,
                        Third = 70,
                        Fourth = 80
                    } );
            }
        }

        public ICommand SwapCommand { get; }

        public ObservableCollection<MyClass> Classes { get; } =
            new ObservableCollection<MyClass>();
    }
}
  

MyClass POCO

 namespace DataGridTest
{
    public class MyClass
    {
        public int First { get; set; }
        public int Second { get; set; }
        public int Third { get; set; }
        public int Fourth { get; set; }
    }
}
  

Комментарии:

1. Спасибо всем за помощь!! У меня получилось.