[英]C#: Filling a datatable with query results obtained using LINQ
我似乎無法弄清楚如何將查詢結果放入可綁定到數據網格的數據表中。 這是我到目前為止的內容:
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 Extended DataGrid,並且我想從中添加的過濾器選項不很支持ObservableCollection,因為它非常滯后,在示例中他們使用了數據表,因此我試圖將整個過程轉換為查詢所需的信息,將其放在datable中並將其放入datagrid中。
這是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>
有什么建議么?
您可以將查詢結果存儲在這樣的列表中
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();
並將其設置為網格的數據源
我想通了,這是我為想要做類似事情的人做的。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.