【问题标题】:WPF DataTable Display with Multiple 1-D Arrays - Can't Display Data in Arrays具有多个一维数组的 WPF 数据表显示 - 无法在数组中显示数据
【发布时间】:2016-04-05 14:14:35
【问题描述】:

我有一个用于嵌入式记录器的 PostgreSQL 数据库,它有 1 列字符串,其余为 Int32[]。我使用 Npgsql 从我的数据库中提取数据,但在显示 Int32[](数组)时遇到问题。

当我从我的数据集中为我的 DataGrid 分配一个数据表时,它会显示第一张图像。目前,我的数组中只有 1 个元素,这是我想要显示的,但我不明白如何访问数据表中的元素。

图片 2 来自 PgAdminIII,这是我正在寻找的。

是否有人知道如何访问 DataTable 中的各个数据成员,以便正确显示我的数组?是从数组切换到单个元素的唯一选择吗?

到目前为止我使用过的代码:

string connstring = "connectionstring stuff";
NpgsqlConnection conn = new NpgsqlConnection(connstring);
conn.Open();
string sql = "SELECT * FROM error000000000";
// data adapter making request from our connection
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
ds.Reset();
// filling DataSet with result from NpgsqlDataAdapter
da.Fill(ds);
dt = ds.Tables[0];
conn.Close();
dataGrid.DataContext = dt;

【问题讨论】:

  • 这听起来像一个愚蠢的问题,但我不得不问......你的数组总是只有一个元素,还是你列出的例子中的偶然事件?

标签: c# arrays wpf postgresql datatable


【解决方案1】:

您看到 Int32[] Array 而不是实际内容的原因是 DataGrid 只是在要显示的任何非字符串类型上调用 ToString

要控制DataGrid 的列的显示方式,请明确指定它们:

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="devicesn" Binding="{Binding devicesn}" />
        <DataGridTextColumn Header="time" Binding="{Binding time}" />
        ...other columns follow here...
    </DataGrid.Columns>
</DataGrid>

现在,如果您可以确定您的数组将始终只包含一个项,您可以指示列仅显示每个数组的第一项:

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="devicesn" Binding="{Binding devicesn}" />
        <DataGridTextColumn Header="time" Binding="{Binding time[0]}" />
        ...other columns follow here...
    </DataGrid.Columns>
</DataGrid>

但这似乎是一种肮脏的方法,因为一旦一个数组为空,它就会失败。

相反,您可以使用能够正确显示数组内容的转换器。定义一个单独的类ArrayConverter

public class ArrayConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var array = value as int[];
        if (array != null)
        {
            return "{" + String.Join(",", array) + "}";
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

...并在 XAML 中引用它:

<Window.Resources>
    <local:ArrayConverter x:Key="ArrayConverter"/>
</Window.Resources>
...
<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="devicesn" Binding="{Binding devicesn}" />
        <DataGridTextColumn Header="time" Binding="{Binding time, Converter={StaticResource ArrayConverter}}" />
    </DataGrid.Columns>
</DataGrid>

(请注意,我使用一个简单的集合对此进行了测试,但使用 DataSets 时的语法应该类似!)

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2017-05-04
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多