c# - 复杂的 SQL 查询数据绑定(bind)到 DataGrid

标签 c# mysql wpf datagrid

我在尝试为现有数据库创建应用程序时遇到了这个复杂的 SQL 查询,并将其转移到 DataGrid。

private void buttonlaunch_Click(object sender, EventArgs e)
    {
        dataAkt.DataContext = GetComments("SELECT a1.*, inspectors.cFullName, organizations.cOrgName, d1.cString, d2.cString, d3.cString, towns.cTownName " +
                                            "FROM akt as a1 "+
                                            "left join inspectors on  a1.nDocInspektor = inspectors.ROWID "+
                                            "left join organizations on organizations.nDirectoryType = organizations.ROWID "+
                                            "left join directories as d1 on a1.nOrgFormVlast = d1.ROWID "+
                                            "left join directories as d2 on a1.nOrgVidPidpr = d2.ROWID "+
                                            "left join directories as d3 on a1.nOrgVidEPDial = d3.ROWID "+
                                            "left join towns on a1.nDocMisceSkladannya=towns.ROWID").DefaultView;
    }

在 XAML 中

<DataGrid x:Name="dataAkt" ItemsSource="{Binding}" AutoGenerateColumns="False"  HorizontalAlignment="Left"  VerticalAlignment="Top" SelectionChanged="dataAkt_SelectionChanged" Margin="10,10,0,0">
   <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=cName}" Header="Название/комментарий" Width="100"  IsReadOnly="True" Visibility="Collapsed" />
        <DataGridTextColumn Binding="{Binding Path=ROWID}" Header="Номер"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cDocNomer}" Header="Номер документа"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=dDocDate, StringFormat=\{0:dd.MM.yyyy\}}" Header="Дата составления"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cOrgName}" Header="Субъект хозяйствования"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cFullName}" Header="Персонал ГОСТРУД"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cDocUch1}" Header="При участии"  Width="100"  IsReadOnly="True"/>
        <DataGridTextColumn Binding="{Binding Path=organizations.cOrgName}" Header="Тип организации"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=d1.cString}" Header="Форма собственности"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=d2.cString}" Header="Вид предпринимательства"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=d3.cString}" Header="Вид экономической деятельности"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=towns.cTownName}" Header="Место составления"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cOrgAdresa}" Header="Адрес организации"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cOrgPhoneFax}" Header="Телефон/Факс"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cPosPIB}" Header="Фамилия, имя, отчество"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cPosPosada}" Header="Должность"  Width="100" IsReadOnly="True"/>
        <DataGridTextColumn Binding="{Binding Path=fPerZaborg}" Header="Задолженность, тыс. руб"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=fPerZaborgZv}" Header="Зад. уволенным, тыс. руб"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=MyBoolValue, Converter={StaticResource BooleanToStringConverter}}" Header="Проверка в ночное время"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=nPerPropoz}" Header="Внесено предложений"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cOrgIndKod}" Header="Идентификационный номер"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cOrgFormVlastKod}" Header="Код формы собственности"  Width="100"  IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=cOrgVidEPDialKod}" Header="Код вида экономической деятельности"  Width="100"  IsReadOnly="True" />
    </DataGrid.Columns>

MySQL Workbench 为我提供了包含我需要的所有列的结果表,但在 dataAkt colunms organizations.cOrgName d1.cString 中d2.cString d3.cString 列是空的。无法解决原因。

最佳答案

您需要为您的列提供有意义的别名。你有:

organizations.cOrgName AS ocOrgName, d1.cString, d2.cString, d3.cString ...

将此更改为:

organizations.cOrgName AS ocOrgName, d1.cString AS d1cString, d2.cString AS d2cString, d3.cString AS d3cString ...

现在您可以像这样正确绑定(bind)到列:

<DataGridTextColumn Binding="{Binding Path=ocOrgName}" Header="Тип организации"  Width="100"  IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding Path=d1cString}" Header="Форма собственности"  Width="100"  IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding Path=d2cString}" Header="Вид предпринимательства"  Width="100"  IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding Path=d3cString}" Header="Вид экономической деятельности"  Width="100"  IsReadOnly="True" />

问题是选择为 towns.cTownName 的列不会在结果集中获得名称 towns.cTownName,它将被命名为 cTownName,没有表前缀。由于表 d1d2d3 都有同名的列 (cString),您需要给他们起别名,以便能够区分哪个是哪个。

关于c# - 复杂的 SQL 查询数据绑定(bind)到 DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38504525/

相关文章:

c# - 从值转换器访问资源字典中的颜色

c# - 如何在 ASP.NET 下拉列表中添加选项组?

c# - 用于从 SQL 查询中提取列定义的正则表达式

mysql - 共同好友Mysql查询

表本身的 MySQL 性能联接

c# - ItemsControl 显示几层数据

wpf - 如何更改 Combobox WPF 的 CornerRadius

c# - 如何在 lambda 表达式中使用局部变量

c# - 将数据绑定(bind)到 WPF 用户控件

mysql - php mysql 选择值小于当前时间(时间戳)的列