Here are few coding snippets for our customers regarding C1Olap for LightSwitch.

Load Default View

If you want a default view to be loaded manually using code, you should add the required view definition file to the project and use the following steps :

  1. Right click on the client project and choose ‘Add Existing Item..”
  2. Browse to the .olapx file location and add it to the project.
  3. Set the ‘Build Action’ of the added file to ‘Embedded Resource’.
  4. You would then be able to load the default view using below code:-

VB.NET

Private Sub AnalyzeProducts_Created()
    Dim _olapPageProxy As IContentItemProxy
    _olapPageProxy = Me.FindControl("C1OlapPage")
    AddHandler _olapPageProxy.ControlAvailable, AddressOf pageProxy_ControlAvailable
End Sub

Private Sub pageProxy_ControlAvailable(sender As Object, e As ControlAvailableEventArgs)
    Dim _olapPage = CType(e.Control, C1OlapPage)
    If _olapPage IsNot Nothing Then
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(
        Sub()
            Dim assembly = Reflection.Assembly.GetExecutingAssembly()
            Dim stream As StreamReader = New StreamReader(assembly.GetManifestResourceStream("LoadViewFile.olapx")) ' set the file name here
             _olapPage.ViewDefinition = stream.ReadToEnd()
        End Sub)
    End If
End Sub

C#.NET

partial void AnalyzeProducts_Created()
{
    IContentItemProxy _olapPageProxy =this. FindControl("C1OlapPage");
    _olapPageProxy.ControlAvailable +=_olapPageProxy_ControlAvailable;
}

void _olapPageProxy_ControlAvailable(object sender, ControlAvailableEventArgs e)
{
    var _olappage = e.Control as C1OlapPage;
    if(_olappage != null)
    {
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke( () =>
        {
             var assembly = Reflection.Assembly.GetExecutingAssembly();
             StreamReader stream = new StreamReader(assembly.GetManifestResourceStream("LoadViewFile.olapx")); // set the file name here
             _olapPage.ViewDefinition = stream.ReadToEnd();
        });
    }
}

Change Selected Tab Order

The default tab shown in C1OlapPanel is OlapGrid. If you wish to change the selected tab order, say select OlapChart, then use the following code :

VB.Net

Private Sub AnalyzeProducts_Created()
    Dim _olapPageProxy As IContentItemProxy
    _olapPageProxy = Me.FindControl("C1OlapPage")
    AddHandler _olapPageProxy.ControlAvailable, AddressOf pageProxy_ControlAvailable
End Sub

Private Sub pageProxy_ControlAvailable(sender As Object, e As ControlAvailableEventArgs)
    Dim _olapPage = CType(e.Control, C1OlapPage)
    If _olapPage IsNot Nothing Then
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(
        Sub()
            Dim parent As TabItem = TryCast(_olapPage.OlapGrid.Parent, TabItem)
            If parent IsNot Nothing Then
                 Dim tabs As TabControl = TryCast(parent.Parent, TabControl)
                 tabs.SelectedIndex = 1
            End If
        End Sub)
    End If
End Sub

C#.NET

partial void AnalyzeProducts_Created()
{
    IContentItemProxy _olapPageProxy = this. FindControl("C1OlapPage");
    _olapPageProxy.ControlAvailable +=_olapPageProxy_ControlAvailable;
}

void _olapPageProxy_ControlAvailable(object sender, ControlAvailableEventArgs e)
{
    var _olappage = e.Control as C1OlapPage;
    if(_olappage != null)
    {
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke( () =>
        {
                TabItem parent = (TabItem)(_olappage.OlapGrid.Parent);
                if(parent !=null)
                {
                    TabControl tabs = (TabControl) parent.Parent;
                    tabs.SelectedIndex = 1;

                }
        });
    }
}

Sorting in Olap

Following code can be used to sort the columns in the Value Fields section in the OlapGrid. Please note that this will work only when there are fields added in the ValueFields section.

VB.NET

Private Sub AnalyzeProducts_Created()
    Dim _olapPageProxy As IContentItemProxy
    _olapPageProxy = Me.FindControl("C1OlapPage")
    AddHandler _olapPageProxy.ControlAvailable, AddressOf pageProxy_ControlAvailable
End Sub

Dim _olapPage as C1OlapPage

Private Sub pageProxy_ControlAvailable(sender As Object, e As ControlAvailableEventArgs)
    Dim _olapPage = CType(e.Control, C1OlapPage)
End Sub

Private Sub Products_Loaded(succeeded As Boolean)
    If succeeded = True Then
        Dispatchers.Main.BeginInvoke(
            Sub()
                Dim olap = _olapPage.OlapEngine
                olap.BeginUpdate()
                olap.RowFields.Add("ProductName")
                olap.RowFields.Add("ProductID")
                olap.ValueFields.Add("UnitPrice")
                olap.EndUpdate()
                _olapPage.OlapEngine.OlapDefaultView.SortDescriptions.Add(New System.ComponentModel.SortDescription(_olapPage.OlapEngine.OlapTable.Columns(0).ColumnEscapedName, System.ComponentModel.ListSortDirection.Descending))
            End Sub)
    End If
End Sub

C#.NET

C1OlapPage _olappage;
partial void AnalyzeProducts_Created()
{
    Dim _olapPageProxy As IContentItemProxy
    IContentItemProxy _olapPageProxy =this. FindControl("C1OlapPage");
    _olapPageProxy.ControlAvailable += (s, ea) =>
     {
        _olappage = ea.Control as C1OlapPage;
     };
}
partial void Products_Loaded(bool succeeded)
{
    if (succeeded)
    {
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
            {
                var olap = _olappage.OlapEngine;
                olap.BeginUpdate();
                olap.RowFields.Add("ProductName");
                olap.RowFields.Add("ProductID");
                olap.ValueFields.Add("UnitPrice");
                olap.EndUpdate();
                _olappage.OlapEngine.OlapDefaultView.SortDescriptions.Add(new System.ComponentModel.SortDescription(_olappage.OlapEngine.OlapTable.Columns[0].ColumnEscapedName, System.ComponentModel.ListSortDirection.Descending));
            });
    }
}

Hide OlapPanel in C1OlapPage

Few customers want to just load the default view and does not want the user to edit the loaded view. For this, you can hide the OlapPanel using the following code.

VB.NET

Private Sub AnalyzeProducts_Created()
    Dim _olapPageProxy As IContentItemProxy
    _olapPageProxy = Me.FindControl("C1OlapPage")
    AddHandler _olapPageProxy.ControlAvailable, AddressOf pageProxy_ControlAvailable
End Sub

Private Sub pageProxy_ControlAvailable(sender As Object, e As ControlAvailableEventArgs)
    Dim _olapPage = CType(e.Control, C1OlapPage)
    If _olapPage IsNot Nothing Then
        Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(
        Sub()
	_olappage.OlapPanel.Visibility = System.Windows.Visibility.Collapsed
        End Sub)
    End If
End Sub

C#.NET

partial void AnalyzeProducts_Created()
{
    Dim _olapPageProxy As IContentItemProxy
    IContentItemProxy _olapPageProxy =this. FindControl("C1OlapPage");
    _olapPageProxy.ControlAvailable += (s, ea) =>
     {
        _olappage = ea.Control as C1OlapPage;
        _olappage.OlapPanel.Visibility = System.Windows.Visibility.Collapsed;
     };
}
Tags: , ,