private void newBtn_Click(object sender, RoutedEventArgs e)
{
try
{
if (txtDayfind.Text == "" || txtDatefind.Text == "" ||
txtTimefind.Text == "" || txtLatfind.Text == "" ||
txtLongfind.Text == "" || txtAddressfind.Text == "" ||
txtaccuracy.Text == "" || txtTypefind.Text == "")
{
Button button = sender as Button;
string content = button.Content.ToString();
foreach (DataTable table in dsr.Tables)
{
if (table.TableName == content)
{
dataGrid1.ItemsSource = table.DefaultView;
dtselect = table;
}
}
}
else
{
dataGrid1.ItemsSource = dtselect.DefaultView;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我正在尝试显示从DataTable到Datagrid的数据,但是DataTable包含超过20万行,因此它提供了System.OutOfMemoryException。而且我无法显示数据,并且应用程序停止工作。
请帮助我解决System.OutOfMemoryException
这个问题。
我有一个包含多个表的数据集,当DataTable的数据较小时,它可以正常工作,但是当DataTable的数据较大时,它会占用更多空间并提供System.outofmemoryException。
答案 0 :(得分:1)
如果从数据库读取数据时引发错误,那么分页是您的解决方案。
但是,如果WPF将您的集合绑定到DataGrid并呈现它时出现错误,则可以尝试将DataGrid EnableRowVirtualization
属性设置为true。如果这样做,将仅呈现当前显示在屏幕上的行。
更新:我认为,您不太了解分页是什么。分页是从表中以块(页面)形式加载数据。这样的事情(注意:我知道,纯字符串非参数化查询是有害的,但是为了简单起见,我将使用它。)
在视图模型类或后面的代码中,定义两个变量:
int pageSize;
和
int currentPage = 0;
当您定义用于加载数据的查询字符串时,您不仅会使用
string query = "SELECT * FROM [your_table_name]";
但是
string query = $"SELECT * FROM [your_table_name] OFFSET {pageSize*currentPage} ROWS FETCH NEXT {pageSize} ROWS ONLY";
执行此查询时,它不会返回表中的所有记录,而是返回从pageSize
开始的currentPage
行
在界面中,您应该放置两个按钮,它们将增加或减少currentPage
并加载下一页。或者可以通过页码手动移动到特定页面。这取决于您和您的应用程序设计。
答案 1 :(得分:0)
<Viewbox Grid.Row="3" Stretch="Fill">
<DataGrid x:Name="dataGrid1" Grid.Row="3" VirtualizingPanel.VirtualizationMode="Recycling" BorderThickness="0" VirtualizingPanel.IsVirtualizing="True" CanUserSortColumns="True" EnableRowVirtualization="True" IsReadOnly="True" CanUserResizeColumns="True" CanUserAddRows="False" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True" Height="600" Width="auto" ItemsSource="{Binding}" AutoGenerateColumns="False" ScrollViewer.VerticalScrollBarVisibility="Auto" Background="#b5d2fc" ClipboardCopyMode="IncludeHeader" SelectionMode="Extended" CanUserDeleteRows="False">
<DataGrid.Columns>
<DataGridTextColumn Width="200" Header="Day" Binding="{Binding Day}"/>
<DataGridTextColumn Width="200" Header="Date" Binding="{Binding Date}"/>
<DataGridTextColumn Width="200" Header="Time" Binding="{Binding Time}"/>
<DataGridTextColumn Width="200" Header="Lat" Binding="{Binding Lat}"/>
<DataGridTextColumn Width="200" Header="Long" Binding="{Binding Long}"/>
<DataGridTextColumn Width="400" Header="Address" Binding="{Binding Address}"/>
<DataGridTextColumn Width="200" Header="Accuracy" Binding="{Binding Accuracy}"/>
<DataGridTextColumn Width="200" Header="Type" Binding="{Binding Type}"/>
</DataGrid.Columns>
</DataGrid>
</Viewbox>
我只是添加了Viewbox,如果我加载了两个以上具有大量数据的文件,那么我的代码也可以正常工作