我正在创建一个UWP应用,并试图用一个DataTable填充我的DataGrid,该DataTable包含我数据库中的数据,但是没有成功。 我已经在寻找解决方案,但无法摆脱错误。
XAML代码:
<StackPanel>
<Button Content="Fill DataGrid" Click="Button_Click"/>
<controls:DataGrid x:Name="dataGrid"
Margin="30"
AutoGenerateColumns="True">
</controls:DataGrid>
</StackPanel>
C#代码:
private static DataTable GetDataTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("FirstName", typeof(string));
dt.Columns.Add("LastName", typeof(string));
dt.Columns.Add("Address", typeof(string));
dt.Columns.Add("City", typeof(string));
for (int i = 0; i < 10; i++)
dt.Rows.Add(i, "text", "text", "text", "text");
return dt;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DataTable dt = GetDataTable();
dataGrid.ItemsSource = dt.DefaultView;
}
此错误20次(该表有10个条目)
Error: BindingExpression path error: 'Item' property not found on 'System.Data.DataRowView'. BindingExpression: Path='Item' DataItem='System.Data.DataRowView'; target element is 'Windows.UI.Xaml.Controls.TextBlock' (Name='null'); target property is 'Text' (type 'String')
当我将ItemSource与DataContext交换时:
dataGrid.DataContext = dt.DefaultView;
我没有收到任何错误,但是我也没有以任何方式更改dataGrid。
我尝试使用DataGridView在Windows窗体中执行相同操作,并且成功完成了
private void button_Click(object sender, EventArgs e)
{
DataTable dt = GetDataTableFromDatabase();
dataGridView1.DataSource = dt;
}
我明白了这一点,所以它对数据库或DataTable来说不是问题。
我设法通过使用DataTable中的实体创建一个List并将其作为数据源的源添加到DataGrid中来实现一种解决方法,但是问题是我有很多不同的DataGrid,如果可以的话,它会容易得多。以类似于Windows窗体中带有dataGridView的示例的方式解决问题。
感谢您的帮助。
答案 0 :(得分:2)
多亏了this网站,我才明白了。
public static void FillDataGrid(DataTable table, DataGrid grid)
{
grid.Columns.Clear();
for (int i = 0; i < table.Columns.Count; i++)
{
grid.Columns.Add(new DataGridTextColumn()
{
Header = table.Columns[i].ColumnName,
Binding = new Binding { Path = new PropertyPath("[" + i.ToString() + "]") }
});
}
var collection = new ObservableCollection<object>();
foreach (DataRow row in table.Rows)
{
collection.Add(row.ItemArray);
}
grid.ItemsSource = collection;
}
也许不是解决这个问题的最优雅的方法,但它确实有效,并且确实满足我的要求。
并且您必须将dataGrid属性“ AutoGenerateColums”设置为“ False”。那给我带来了很多问题。
答案 1 :(得分:0)
我认为您误解了Windows社区工具包中的DataGrid
。 DataGrid
无法像Winfrom一样解析DataTable
。要使用DataGrid
,可以参考此code sample。以下是xaml代码。
<controls:DataGrid
Grid.Row="1"
x:Name="dataGrid"
Margin="12"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
AlternatingRowBackground="Transparent"
AlternatingRowForeground="Gray"
AreRowDetailsFrozen="False"
AreRowGroupHeadersFrozen="True"
AutoGenerateColumns="False"
CanUserSortColumns="False"
CanUserReorderColumns="True"
CanUserResizeColumns="True"
ColumnHeaderHeight="32"
MaxColumnWidth="400"
FrozenColumnCount="0"
GridLinesVisibility="None"
HeadersVisibility="Column"
IsReadOnly="False"
RowDetailsTemplate="{StaticResource RowDetailsTemplate}"
RowDetailsVisibilityMode="Collapsed"
SelectionMode="Extended"
RowGroupHeaderPropertyNameAlternative="Range">
<controls:DataGrid.Columns>
<controls:DataGridTextColumn Header="Rank" Binding="{Binding Rank}" Tag="Rank" />
<controls:DataGridComboBoxColumn Header="Mountain" Binding="{Binding Mountain}" Tag="Mountain" />
<controls:DataGridTextColumn Header="Height (m)" Binding="{Binding Height_m}" Tag="Height_m" />
<controls:DataGridTextColumn Header="Range" Binding="{Binding Range}" Tag="Range" />
<controls:DataGridTextColumn Header="Parent Mountain" Binding="{Binding Parent_mountain}" Tag="Parent_mountain" />
</controls:DataGrid.Columns>
</controls:DataGrid>
此链接是DataGrid
中的data source。
答案 2 :(得分:0)
我不知道这是一个更好的答案,但是当我发现这个问题时,我几乎可以使用它。我习惯了 Asp.Net,所以这就是我想出来的。
在 xaml 页面(或使用)xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
nModel.Data.ListData = 类文件。
public class ListData
{
public string HashId { get; set; }
public int SortOrder { get; set; }
public string StrSortOrder { get; set; }
public string DataPoint { get; set; }
public string Rfid { get; set; }
public string Description { get; set; }
public string Attch { get; set; }
}
在页面代码隐藏中:
DataTable dt = new DataTable();
dt = nModel.DataDAL.ListData.ListDataDataTable("30039");
List<nModel.Data.ListData> dataList = new List<nModel.Data.ListData>();
for (int i = 0; i < dt.Rows.Count; i++)
{
nModel.Data.ListData ListData = new nModel.Data.ListData();
ListData.StrSortOrder = dt.Rows[i]["SortOrder"].ToString();
ListData.DataPoint = dt.Rows[i]["DataPoint"].ToString();
ListData.Rfid = dt.Rows[i]["Rfid"].ToString();
dataList.Add(ListData);
}
dataGrid.ItemsSource = dataList;
和网格
<controls:DataGrid x:Name="dataGrid"
AutoGenerateColumns="False">
<controls:DataGrid.Columns>
<controls:DataGridTextColumn Header="Piece#"
Binding="{Binding StrSortOrder}"/>
<controls:DataGridTextColumn Header="SerialNo"
Binding="{Binding DataPoint}"/>
<controls:DataGridTextColumn Header="Rfid"
Binding="{Binding Rfid}"/>
</controls:DataGrid.Columns>
</controls:DataGrid>
花了几天学习 uwp 后很明显,为什么没有人使用 DataTables。
GridView 和 ListView 控件与 Asp.Net 版本不同。甚至不清楚 DataGrid 控件是否是一个东西。当我回到这个问题并深入挖掘时,我有些沮丧。
感谢您的提问...