简体   繁体   中英

C#: Filling a datatable with query results obtained using LINQ

I can't seem to figure out how get my query results inside a datatable which I can bind to my datagrid. Here's what I have so far:

C#:

DataTable _sourceTable;

public DataTable SourceTable
    {
        get
        {
            return _sourceTable;
        }
        set
        {
            _sourceTable = value;
            OnPropertyChanged("SourceTable");

        }
    }

    public class TradesClass
    {
        public string TraderID { get; set; }
        public DateTime TradeDate { get; set; }
        public TimeSpan TradeTime { get; set; }
        public DateTime? CloseDateTime { get; set; }
        public string ClientName { get; set; }
        public string CurPair { get; set; }
        public int Amnt { get; set; }
        public string Action { get; set; }
        public decimal ExecutedRate { get; set; }
    }

try
        {
            collection = new ObservableCollection<TradesClass>();

            var OpenTradesQuery = from qa in connection.QuickAnalyzerInputs
                                  where qa.TradeClosedDateTime == null
                                  select new TradesClass
                                  {
                                      TraderID = qa.TraderID,
                                      TradeDate = qa.ClientTradedDate,
                                      TradeTime = qa.ClientTradedTime,
                                      CloseDateTime = qa.TradeClosedDateTime,
                                      ClientName = qa.ClientName,
                                      CurPair = qa.CurrencyPair,
                                      Amnt = qa.TradedAmount,
                                      Action = qa.Action,
                                      ExecutedRate = qa.ExecutedRate
                                  };



            if(OpenTradesQuery.Count() > 0)
            {
                numOfrecords = OpenTradesQuery.Count();
                DataContext = this;

                foreach (var item in OpenTradesQuery)
                {
                    collection.Add(item);
                }

                DG_openTrades.ItemsSource = collection;

            }
            else
            {
                MeBox.Show("You have no open trades.", "", MessageBoxButton.OK, MessageBoxImage.Error);
            }

So right now I just fill my datagrid with the Observable collection, however I changed my grid to use the WPF Extended DataGrid and the filter option I want to add from it doesn't support ObservableCollection well its very laggy, the example they have uses a datatable so I'm trying to convert this whole process to query the information I need, place it in a datable and put it in the datagrid.

Here's the XAML:

<ExtendedGridControl:ExtendedDataGrid x:Name="DG_openTrades"
                                          RowHeaderWidth="17"  AutoGenerateColumns="False" HideColumnChooser="True" 
                                          IsSynchronizedWithCurrentItem="True"
                                          HorizontalScrollBarVisibility="Visible"
                                          VerticalScrollBarVisibility="Visible"
                                          SelectionMode="Single" 
                                          SelectionUnit="FullRow"
                                          CanUserAddRows="False"
                                          CanUserDeleteRows="False"
                                          SearchAutoFilterVisibility="Visible" AutoFilterFontSize="12"
                                          Grid.ColumnSpan="3" Grid.Column="1" Grid.Row="2" Margin="0,0,0,1" >
        <Control:DataGrid.ContextMenu>
            <ContextMenu >
                <MenuItem Header="Increase Trade Amount" Click="IncTradeAmnt_Click"  />
                <MenuItem Header="Decrease Trade Amount" Click="DecTradeAmnt_Click"  />
                <MenuItem Header="Close Trade" Click="CloseTrade_Click"  />
            </ContextMenu>
        </Control:DataGrid.ContextMenu>

        <Control:DataGrid.Columns>
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Trader ID" AllowAutoFilter="True"
                                       Binding="{Binding TraderID}" IsReadOnly="True" />
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Date" AllowAutoFilter="False"
                                       Binding="{Binding TradeDate}" />
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Time"
                                       Binding="{Binding TradeTime}" AllowAutoFilter="False"/>
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Client Name"
                                       Binding="{Binding ClientName}" AllowAutoFilter="True"
                                       CanUserSort="False"/>
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Pair"
                                       Binding="{Binding CurPair}" AllowAutoFilter="False"
                                       CanUserSort="False"/>
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Amount"
                                       Binding="{Binding Amnt}" AllowAutoFilter="False"
                                       CanUserSort="False"/>
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Action"
                                       Binding="{Binding Action}" AllowAutoFilter="False"
                                       CanUserSort="False"/>
            <ExtendedColumn:ExtendedDataGridTextColumn Header="Executed Rate"
                                       Binding="{Binding ExecutedRate}" AllowAutoFilter="False"
                                       CanUserSort="False"/>

        </Control:DataGrid.Columns>
    </ExtendedGridControl:ExtendedDataGrid>

Any suggestions?

you can store the query result in list like this

var OpenTradesQuery = (from qa in connection.QuickAnalyzerInputs
                              where qa.TradeClosedDateTime == null
                              select new TradesClass
                              {
                                  TraderID = qa.TraderID,
                                  TradeDate = qa.ClientTradedDate,
                                  TradeTime = qa.ClientTradedTime,
                                  CloseDateTime = qa.TradeClosedDateTime,
                                  ClientName = qa.ClientName,
                                  CurPair = qa.CurrencyPair,
                                  Amnt = qa.TradedAmount,
                                  Action = qa.Action,
                                  ExecutedRate = qa.ExecutedRate
                              }).ToList();

and set it as datasource for your grid

I figured it out, here's how I did it for anyone who wants to do something similar.

try
        {
            SourceTable = new DataTable();

            SourceTable.Columns.AddRange(new DataColumn[]{
                new DataColumn("TraderID", typeof(string)),
                new DataColumn("TradeDate", typeof(DateTime)),
                new DataColumn("TradeTime", typeof(TimeSpan)),
                new DataColumn("ClientName", typeof(string)),
                new DataColumn("CurPair", typeof(string)),
                new DataColumn("Amnt", typeof(int)),
                new DataColumn("Action", typeof(string)),
                new DataColumn("ExecutedRate", typeof(decimal))
            });

            DataRow row = null;

            var OpenTradesQuery = from qa in connection.QuickAnalyzerInputs
                                  where qa.TradeClosedDateTime == null
                                  select new
                                  {
                                      qa.TraderID,
                                      qa.ClientTradedDate,
                                      qa.ClientTradedTime,
                                      qa.ClientName,
                                      qa.CurrencyPair,
                                      qa.TradedAmount,
                                      qa.Action,
                                      qa.ExecutedRate
                                  };


            if (OpenTradesQuery.Count() > 0)
            {
                numOfrecords = OpenTradesQuery.Count();
                DataContext = this;

                foreach (var rowObj in OpenTradesQuery)
                {
                    row = SourceTable.NewRow();
                    SourceTable.Rows.Add(rowObj.TraderID, rowObj.ClientTradedDate, rowObj.ClientTradedTime, rowObj.ClientName, rowObj.CurrencyPair, rowObj.TradedAmount, rowObj.Action, rowObj.ExecutedRate);
                }

            }
            else
            {
                MeBox.Show("You have no open trades.", "", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }
        catch
        {
            MeBox.Show("Error retrieving data.", "Database Error", MessageBoxButton.OK, MessageBoxImage.Error);

        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM