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);
    }
}

मैं डेटाटेबल से डेटाग्रिड तक डेटा प्रदर्शित करने का प्रयास कर रहा हूं लेकिन डेटाटेबल में 0.2 मिलियन से अधिक पंक्तियां हैं, इसलिए यह System.OutOfMemoryException देता है। और मैं डेटा प्रदर्शित करने में सक्षम नहीं हूं और एप्लिकेशन काम करना बंद कर देता है।

कृपया System.OutOfMemoryException इस समस्या का समाधान करने में मेरी सहायता करें। मेरे पास एक डेटासेट है जिसमें कई टेबल होते हैं जब डेटाटेबल में छोटा डेटा होता है तो यह ठीक काम करता है, लेकिन जब डेटाटेबल में बड़ा डेटा होता है तो यह अधिक स्थान का उपभोग करता है और System.outofmemoryexception देता है।

4
user10753256 6 पद 2018, 10:13

2 जवाब

सबसे बढ़िया उत्तर
<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>

मैं बस व्यूबॉक्स जोड़ता हूं और मेरा कोड ठीक काम करता है अगर मैं दो से अधिक फाइलों को लोड करता हूं जिनमें विशाल डेटा होता है तो यह कम मेमोरी का उपभोग करता है

0
user10753256 2 जिंदा 2019, 10:25

यदि डेटाबेस से डेटा पढ़ते समय त्रुटि होती है, तो पेजिनेशन आपका समाधान है।

लेकिन अगर आपको कोई त्रुटि मिलती है जब डब्ल्यूपीएफ आपके संग्रह को डेटाग्रिड से जोड़ता है और इसे प्रस्तुत करता है, तो आप डेटाग्रिड EnableRowVirtualization संपत्ति को सत्य पर सेट करने का प्रयास कर सकते हैं। यदि आप ऐसा करते हैं, तो स्क्रीन पर वर्तमान में प्रदर्शित केवल पंक्तियों को ही रेंडर किया जाएगा।

अद्यतन करें: मुझे लगता है, आप बिल्कुल नहीं समझते हैं कि पेजिंग क्या है। पेजिंग तालिका से डेटा को विखंडू (पृष्ठों) में लोड कर रहा है। कुछ इस तरह (नोट: मैं समझता हूं, कि सादा स्ट्रिंग गैर-पैरामीट्रिज्ड प्रश्न बुरा है, लेकिन मैं इसे सादगी के लिए उपयोग करूंगा)।

आपके व्यू-मॉडल वर्ग में या कोड बिहाइंड में आप दो चर परिभाषित करते हैं:

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
Дмитро Іванов 7 पद 2018, 15:46