【问题标题】:Getting System.Data.DataRows instead of actual value when assigning data table as tabitem.content将数据表分配为 tabitem.content 时获取 System.Data.DataRows 而不是实际值
【发布时间】:2018-10-25 04:44:35
【问题描述】:
public void LoadData()
{
    sy.OpenFileDialog op = new sy.OpenFileDialog();
    op.Multiselect = true;

    if (op.ShowDialog() == sy.DialogResult.OK)
    {
        for each (string s in op.FileNames)
        {
            val = s;
            values = s.Split('\\');
            lastItem = values[values.Length - 1];                   
            newTabItem = new TabItem
            {
                Header = lastItem,
            };
            tabControl1.Items.Add(newTabItem);
            ReadJsonFile();                   

            DataTable dt = new DataTable();
            dt.Columns.Add("Day", typeof(string));
            dt.Columns.Add("Date", typeof(string));
            dt.Columns.Add("Time", typeof(string));
            dt.Columns.Add("Lat", typeof(string));
            dt.Columns.Add("Long", typeof(string));
            dt.Columns.Add("Address", typeof(string));
            dt.Columns.Add("Type", typeof(string));

            foreach (var item in data)
            {
                dt.Rows.Add(item.getDay(), item.getDate(), item.getTime(), item.getLat(), item.getLongi(), item.getAddresst(), item.getTYpe());                    
            }
            newTabItem.Content =  dt;

        }
    }
}

public void ReadJsonFile()
{
    string json = string.Empty;

    using (StreamReader r = new StreamReader(val))
    {
        json = r.ReadToEnd();
        var test = JObject.Parse(json);
        JArray items = (JArray)test["locations"];
        int length = items.Count;
        data = new List<Info>();

        for (int i = 0; i < items.Count; i++)
        {
            var d = test["locations"][i]["timestampMs"];
            double dTimeSpan = Convert.ToDouble(d);
            DateTime dtReturn = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(Math.Round(dTimeSpan / 1000d)).ToLocalTime();
            string printDate = dtReturn.DayOfWeek.ToString() + "," + " " + dtReturn.ToShortDateString() + " " + dtReturn.ToShortTimeString();
            day = dtReturn.DayOfWeek.ToString();
            date = dtReturn.ToShortDateString();
            time = dtReturn.ToShortTimeString();
            var e = test["locations"][i]["latitudeE7"];
            var f = test["locations"][i]["longitudeE7"];
            //getLocationByGeoLocation(e.ToString(), f.ToString());                   
            var g = test["locations"][i]["activity"] != null;

            if (g == true)
            {
                JArray items1 = (JArray)test["locations"][i]["activity"];
                int length1 = items1.Count;

                while (j < items1.Count )
                {
                    if(j == 0)
                    { 
                        var h = test["locations"][i]["activity"][j]["activity"][j]["type"];
                        type = h.ToString();
                        j = 1;
                    }
                    else { }
                    j++;
                }
                j = 0;
            }
            else { }

            Info ddm = new Info(day, date, time, lat, longi, address, type);
            data.Add(ddm);                   
        }
    }
    return;
}

我想要在绑定数据网格的 tabitem 上这样的值,但我得到这样的结果

这是我的 xaml 文件代码

<DockPanel Height="auto" Width="auto">
    <DockPanel Height="auto" Width="auto" DockPanel.Dock="Top"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True"  >
        <TabControl  x:Name="tabControl1" Height="auto" Width="auto" ItemsSource="{Binding}" TabStripPlacement="Top" SelectionChanged="tabControl1_SelectionChanged" >
            <TabControl.ContentTemplate >
                <DataTemplate>
                    <DataGrid x:Name="dataGrid1" Height="auto" Width="auto" ItemsSource="{Binding}" AutoGenerateColumns="False" >
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="*"  Header="Day"  Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Date" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Time" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Lat" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Long" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Address" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Type" Binding="{Binding}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </DockPanel>
</DockPanel>

如何将数据表显示为选项卡项内容以显示实际值 第一张图片显示了我想在绑定在选项卡上的网格上显示的数据表值。

第二张图片是我得到的值而不是实际值。

【问题讨论】:

  • 当相关列的 DataField 值与基础源列名称不匹配时,可能会出现此问题

标签: c# wpf xaml datatable


【解决方案1】:

您应该在每一列中设置正确的绑定路径。使用{Binding} 在每个单元格中给出DataRow,因为{Binding} 意味着应该在单元格中显示整行,唯一的方法是调用DataRow.ToString() 并显示结果。

您需要在绑定中指定行字段:

<DataGridTextColumn Width="*"  Header="Day"  Binding="{Binding [Day]}"/>
<DataGridTextColumn Width="*" Header="Date" Binding="{Binding [Date]}"/>
<DataGridTextColumn Width="*" Header="Time" Binding="{Binding [Time]}"/>
<DataGridTextColumn Width="*" Header="Lat" Binding="{Binding [Lat]}"/>
<DataGridTextColumn Width="*" Header="Long" Binding="{Binding [Long]}"/>
<DataGridTextColumn Width="*" Header="Address" Binding="{Binding [Address]}"/>
<DataGridTextColumn Width="*" Header="Type" Binding="{Binding [Type]}"/>

【讨论】:

  • 我试试这个代码,但只有表的最后一个值是显示
  • 可以加个截图吗?
  • 是否可以在数据网格的所有列上添加和应用过滤器
  • 有DataTable.DefaultView.RowFilter 属性用于过滤DataTable
  • 当我应用过滤器并假设打开了两个文件然后过滤器仅适用于第二个文件而不适用于第一个文件时,如何在所有打开的选项卡上应用过滤器
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多