2013-04-09 4 views
0

J'ai créé un graphique WPF qui extrait des données d'une base de données. J'ai besoin que les données changent automatiquement au changement de date.WPF Modification de graphique lorsque la date du calendrier change

Voici mon code:

Code XAML:

<DVC:Chart Name="callLogs" 
     Background="SteelBlue" 
     Margin="136,0,0,0" 
       Title="Calls Per Hour" 
       BorderBrush="Transparent"> 
     <DVC:Chart.LegendStyle> 
      <Style TargetType="Control"> 
       <Setter Property="Width" Value="0"/> 
       <Setter Property="Height" Value="0"/> 
      </Style> 
     </DVC:Chart.LegendStyle> 
     <DVC:Chart.Axes> 
      <DVC:LinearAxis Orientation="Y" Title="Ammount of calls" ShowGridLines="True"/> 
     </DVC:Chart.Axes> 
     <DVC:Chart.Series> 
      <DVC:ColumnSeries Title="Calls per Hour" 
       IndependentValueBinding="{Binding Path=Key}" 
       DependentValueBinding="{Binding Path=Value}"> 
      </DVC:ColumnSeries> 
     </DVC:Chart.Series> 
    </DVC:Chart> 
    <DatePicker x:Name="Datepicker1" HorizontalAlignment="Left" 
       Margin="10,21,0,0" 
       VerticalAlignment="Top" 
       Width="126" 
       BorderBrush="Transparent" 
       SelectedDateFormat="Short"/> 

code C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using System.Data; 
using System.Data.SqlClient; 
using System.Xml; 


using System.Windows.Controls.DataVisualization; 
using System.Windows.Controls.Primitives; 
using System.Windows.Controls.DataVisualization.Charting; 

namespace MainWindow 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     LoadColumnChartData(); 
    } 

    private void LoadColumnChartData() 
    { 
     Datepicker1.SelectedDate = DateTime.Today; 
     string pickDate = Datepicker1.SelectedDate.Value.ToString("yyyy-MM-dd"); 
     int[] callCounter = new int[100]; 
     int[] callHour = new int[100]; 
     int counter = 0; 

     SqlConnection sqlConnection1 = new SqlConnection("Server=nl-reportserver;Database=RealConnect;User Id=sa;Password=<password>"); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader reader; 

     cmd.Parameters.Add("@pickDate", pickDate); 
     cmd.CommandText = "SELECT * FROM RC_callsperhour where convert(date,call_logdate,120) = convert(date,@pickDate,120) order by callhour"; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = sqlConnection1; 

     sqlConnection1.Open(); 

     reader = cmd.ExecuteReader(); 
     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       callHour[counter] = reader.GetInt32(2); 
       callCounter[counter] = reader.GetInt32(3); 
       counter++; 
      } 
     } 
     else 
     { 
      MessageBox.Show("No rows found."); 
     } 
     reader.Close(); 

     sqlConnection1.Close(); 

     ((ColumnSeries)callLogs.Series[0]).ItemsSource = Enumerable.Range(0, counter).Select(i => new KeyValuePair<int, int>(callHour[i], callCounter[i])).ToArray(); 

    } 
} 
} 

S'il vous plaît noter que j'ai supprimé le mot de passe de la connexion SQL pour des raisons de sécurité.

Comment ferais-je cela?

Répondre

0

Vous pouvez utiliser la liaison WPF pour obtenir des données. D'abord, vous devez créer un ObservableCollection<YourDataModel> puis la date a changé il définit la propriété de votre classe modèle:

public class YourDataModel 
{ 
    public property int CallHour { get;set; } 
    public property int CallCounter { get;set; } 

    public YourDataModel(callHour int, callCounter int) 
    { 
     CallHour = callHour; 
     CallCounter = callCounter; 
    } 
} 


public partial class MainWindow : Window 
{ 
    private ObservableCollection<YourDataModel> dataModel; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     dataModel = new ObservableCollection<YourDataModel>(); 

     //set itemsource property or you can bind from XAML 
     //which is name columnseries x:Name=CallsPerHour 
     CallsPerHour.ItemsSource = dataModel; 
    } 

    //when date change running this function 
    private void GettingDataFromSql() 
    { 
     ... 
     while (reader.Read()) 
     { 
      YourDataModel data = new YourDataModel(reader.GetInt32(2), 
      reader.GetInt32(3)); 
      dataModel.Add(data); 
     } 
    } 
} 

XAML:

<DVC:Chart.Series> 
    <DVC:ColumnSeries Title="Calls per Hour" 
     IndependentValueBinding="{Binding CallHour, Mode=OneWay}" 
     DependentValueBinding="{Binding CallCounter, Mode=OneWay}"> 
    </DVC:ColumnSeries> 
</DVC:Chart.Series> 
Questions connexes