C#:使用LINQ填充查询结果的数据表

时间:2014-03-11 12:41:10

标签: c# wpf linq datagrid datatable

我似乎无法弄清楚如何将我的查询结果放入一个可以绑定到我的数据网格的数据表中。这是我到目前为止所做的:

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

所以现在我只是使用Observable集合填充我的数据网格,但是我改变了我的网格以使用WPF扩展数据网格,我想从中添加的过滤器选项不支持ObservableCollection它非常滞后,例如使用数据表,所以我试图转换整个过程来查询我需要的信息,将它放在数据中并将其放在数据网格中。

这是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>

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以将查询结果存储在此列表

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

并将其设置为网格的数据源

答案 1 :(得分:0)

我想通了,这就是我为那些想要做类似事情的人做的。

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

        }