Press "Enter" to skip to content

10 – MiniSqlAgent – User Control Fine Tuning – DateTimePicker, DateTimeUpDown, Combobox

Facciamo il fine tuning dello User Control disegnato nel post precedente a questo e disponibile QUI  in questo articolo modificheremo le semplici textbox inserite per il primo test e aggiungeremo un DateTimePicker per la data della prossima esecuzione del Job, un DateTimeUpDown per l’ora della prossima esecuzione del job, in IntegerUpDown per la gestione dell’intervallo di esecuzione ed una combobox per selezionare le connessioni disponibili sul sistema per l’esecuzione dei job. Per fornire la lista alla combobox aggiungiamo ai parametri di configurazione del servizio e della sua console un file che conterrà tutte le stringhe di connessione valide a SQL Server che vogliamo memorizzare.

Per creare uno User Control con il controllo minimale sui dati forniti, sostituiamo gli editor basici usati nel primo post che aveva il solo scopo di testare la possibilità di modificare un Job e salvarlo e facciamo la seguente serie di modifiche:

  • ServiceSettingsManager (lo abbiamo creato nel post Aggiungere alcuni parametri di configurazione ad un Servizio Windows) Gli aggiungiamo un campo che contiene il nome del file delle stringhe di connessione a SQL Server, questo nome di file sarà agganciato ad un editor di tipo SqlConnectionsFile (che abbiamo realizzato nel post 3 User Control WPF Riutilizzabili per Spiegare come si fanno le Dependency property) che ci permetterà di creare e salvare il file per le stringhe di connessione che vogliamo utilizzare per eseguire i Job dal servizio.
  • ServiceContext (lo abbiamo creato nel post Creare un Servizio Windows installabile con InnoSetup) Andremo ad aggiungervi una property che rende disponibili le connection info andando a leggere le stringhe di connessione create nel nostro file delle connessioni utilizzando l’apposito editor.
  • MiniSqlAgentJobModel lo abbiamo discusso nel post precedente questo, lo modifichiamo per aggiungere una property che rende disponibile allo user control la lista delle stringhe di connessione disponibili.
  • MiniSqlAgentJobControl Sostituiamo le Textbox con i nuovi controlli mirati sul tipo di dato da richiedere all’utente.

Le modifiche a ServiceSettingsManager

protected override void LoadAppSettings()
{
    try
    {
......

    mAppSettings.Add(new DnwSetting()
    {
        Category = Properties.Resources.txtSSMCatConfiguration,
        ID = STT_JobsSqlConnectionsFile,
        Description = Properties.Resources.txtSSMJobsSqlConnectionsFile,
        EditorType = EditorType.SqlConnectionsFile,
        Position = 20,
        Value = "",
 
    });

......
    }
}

public string JobsSqlConnectionsFile
{
    get
    {
        return mAppSettings[STT_JobsSqlConnectionsFile].Value;
    }
}

Abbiamo modificato il metodo LoadSettings generando il nuovo parametro di configurazione e lo abbiamo esposto come tutti gli altri tramite una property read only.

msa_04_settings_01

Le modifiche alla finestra dei parametri di configurazione dopo l’aggiunta di questo nuovo parametro. L’editor che abbiamo disegnato e messo in libreria fornisce già tutti i servizi per selezionare, creare e modificare i file delle connessioni a SQL Server.

Le modifiche a ServiceContext

private SqlConnectionInfosCollection mSqlConnections;

public SqlConnectionInfosCollection SqlConnections
{
    get
    {
        if (mSqlConnections == null)
        {
            if (SettingsManager.JobsSqlConnectionsFile.XDwIsNullOrTrimEmpty() || !File.Exists(SettingsManager.JobsSqlConnectionsFile))
            {
                mSqlConnections = new SqlConnectionInfosCollection();
            }
            else
            {
            try
            {
                string jsonData = null;
                if (Path.GetExtension(SettingsManager.JobsSqlConnectionsFile) == ".dnwx")
                {
                    jsonData = EncDec.Decrypt(SettingsManager.JobsSqlConnectionsFile, true);
                }
                else
                {
                    jsonData = File.ReadAllText(SettingsManager.JobsSqlConnectionsFile);
                }

                mSqlConnections = SqlConnectionInfosCollection.Deserialize(jsonData, false);
            }
            catch (Exception ex)
            {
                EventLogger.SendMsg(ex);
                mSqlConnections = new SqlConnectionInfosCollection();
            }
        }
    }
    return mSqlConnections;
    }
}

La property che espone il contenuto del file delle connessioni così che possano essere utilizzate dal servizio e dalla console del servizio.

Le modifiche a MiniSqlAgentJobModel

public SqlConnectionInfosCollection SqlConnectionsList
{
    get
    {
        return ServiceContext.Instance.SqlConnections;
    }
}

Una modifica molto semplice, esponiamo la property contenente la collezione delle connessioni all’interno del model in modo che possa essere utilizzata per il binding alla combobox.

Le modifiche allo XAML dello User Control MiniSqlAgentJobControl

xmlns:wix="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended"

Abbiamo aggiunto il namespace relativo alla libreria WpfToolkit.Extended che avevamo già utilizzato per gli user control in libreria.

<UserControl.Resources>
    <ResourceDictionary>
.........
        <DataTemplate x:Key="cboCn">
            <StackPanel FlowDirection="LeftToRight" Orientation="Vertical" Margin="4,4,4,4">
                <TextBlock Text="{Binding Description}"/>
            </StackPanel>
        </DataTemplate>
    </ResourceDictionary>
</UserControl.Resources>

Abbiamo per prima cosa aggiunto alle resources dello User Control il data template che sarà utilizzato per visualizzare la lista delle connessioni disponibili dalla combobox, ha in questo caso un solo campo di testo che è collegato alla descrizione dell’oggetto SqlConnectionInfo.

<TextBlock Grid.Row="2" 
    Grid.Column="0"  	
    Text="Next Execution time (DD/MM/YYYY HH:MM)" 
    Margin="10" />
<StackPanel 
    Grid.Row="2" 
    Grid.Column="1"
    Margin="10,5,10,5"
    FlowDirection="LeftToRight"  	
    Orientation="Horizontal">
	
<wix:DateTimePicker 
    Format="ShortDate"
    Margin="0,0,10,0"
    HorizontalAlignment="Left" 
    Width="130"  	
    VerticalAlignment="Center"  	
    Value="{Binding Job.NextExecutionTime}"
    IsEnabled="{Binding IsInEditMode}"
    ShowButtonSpinner="False"/>
<wix:DateTimeUpDown Format="ShortTime"
    Margin="10,0,10,0"
    HorizontalAlignment="Left" 
    Width="80"  	
    VerticalAlignment="Center"  	
    Value="{Binding Job.NextExecutionTime}"
    IsEnabled="{Binding IsInEditMode}"/>
</StackPanel>

La modifica all’editor della Data e ora di prossima esecuzione, abbiamo sostituito la textbox con 2 diversi controlli uno per modificare la data ed uno per modificare l’ora, entrambi collegati allo stesso campo dell’oggetto Job del view model.

<TextBlock 
    Grid.Row="3" 
    Grid.Column="0"  	
    Text="Execution interval (in Minutes)" 
    Margin="10" />
<wix:IntegerUpDown  
    FormatString="G0"
    Grid.Row="3" 
    Grid.Column="1"  	
    HorizontalAlignment="Left" 
    Width="80"  	
    VerticalAlignment="Center"  	
    Value="{Binding Job.ExecutionInterval}"   	
    Margin="10,5,10,5"
    IsEnabled="{Binding IsInEditMode}"/>

La modifica all’editor dell’intervallo di esecuzione espresso in minuti, abbiamo usato un IntegerUpDown per modificare il valore.

<TextBlock 
    Grid.Row="4" 
    Grid.Column="0"  	
    Text="Sql Server connection name" 
    Margin="10" />
<ComboBox 
    Grid.Row="4" 
    Grid.Column="1"  	
    ItemsSource="{Binding SqlConnectionsList}"
    ItemTemplate="{StaticResource cboCn}"
    SelectedValue="{Binding Job.ConnectionID}"
    IsEnabled="{Binding IsInEditMode}"
    SelectedValuePath="ConnectionID"
    HorizontalAlignment="Stretch"
    Margin="10,5,10,5" />

La modifica all’editor per il nome della connection a sql server, abbiamo inserito una combobox ed abbiamo predisposto le seguenti cose:

  • L’ItemsSource = la property che indica qual’è la sorgente dati della lista, è in binding alla lista delle connection info.
  • ItemTemplate = è inizializzato con il nome del DataTemplate che abbiamo creato nelle resources.
  • SelectedValue = è in binding con la property del job che deve contenere l’id della connessione
  • SelectedValuePath = indica la property degli Item della lista della connection info che contiene il valore fornito dalla combo, in questo caso la property ConnectionID di SqlConnectionInfo.

Gli altri parametri sono uguali a quelli precedentemente impostati per la textbox per l’aspetto e l’attivazione della modifica del contenuto del controllo.

Il risultato finale delle nostre modifiche sulla User Interface di test è il seguente:

msa_04_user_control_01

Ed il contenuto del file XML del Job salvato su disco è il seguente:

msa_04_user_control_02

Abbiamo migliorato la funzionalità del nostro User Control, nei prossimi post, costruiremo un manager in grado di gestire una serie di Job utilizzando questo User Control.

Il codice del progetto relativo a questo articolo è disponibile al link seguente:

Il codice relativo alle librerie di uso comune collegate a questo progetto è disponibile al link seguente:

Per qualsiasi domanda, utilizzate il link al modulo di contatto o il link al forum Microsoft Italia dove rispondo quasi ogni giorno.