Reputation: 749
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?
Upvotes: 0
Views: 766
Reputation: 749
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);
}
Upvotes: 0
Reputation: 4963
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
Upvotes: 1