Display a Search List from a Third-party Application

This article demonstrates how to call a search list from a custom .NET WinForm client application, and then use the ID returned from the search list to call upon a View Data Form. This example demonstrates the use of the DataFormWebHostDialog class within the Blackbaud.AppFx.UIModeling.DataFormWebHost namespace that comes with the Infinity SDK. The Blackbaud.AppFx.UIModeling.DataFormWebHost.dll assembly is located within the SDK\DLLReferences folder.

The source code for this example can be found at the bottom this article.

One of the cool things about the Blackbaud SDK is all of the Visual Studio templates to create projects and Infinity features/specs. One such template is the "Web API Client Template."

This template helps you to jump start a project by automatically creating a reference to Blackbaud.AppFx.WebApi, Blackbaud.AppFx.XMLTypes, Blackbaud.AppFx.dll, among others. Here is a newly created project based on this template and the resulting assembly references.

The template stubs out some code within Module1.vb to display a search list outside of the Infinity shell through ShowSearchExample().

Private Sub ShowSearchExample()

        'to show a data form, use the DataFormWebHostDialog component
        Dim form = New SearchFormWebHostDialog
        form.ServiceUrlBasePath = serviceUrlBasePath
        form.DatabaseName = databaseName
        form.ApplicationTitle = applicationTitle

        'supply credentials to authenticate
        'form.Credentials = New System.Net.NetworkCredential("<username>", "<password>", "<domain>")
        ' or
        form.Credentials = System.Net.CredentialCache.DefaultCredentials

        'indicate the Id of the search form to show (in this example, 
        'the "Constituent Search" feature is used)
        form.SearchListId = New Guid("23C5C603-D7D8-4106-AECC-65392B563887")

        'show the search
        If form.ShowDialog() = Windows.Forms.DialogResult.OK Then
            MsgBox(String.Format("You selected a record with id = {0} and translation of {1}", _
                                 form.SelectedRecordId, form.SelectedRecordTranslation))
        End If

End Sub

Instead of the API code being in Module1.vb, I rearranged the code into a VB class file called BlackbaudInfinityUIHelper.vb. I rewired the module1.vb to open a WinForm at startup. Here is the new, modified Module1.vb:

Module Module1

    'update the values for your system settings
    Public Const serviceUrlBasePath As String = "http://localhost/BBInfinityPROD2.7.1633.0/"
    Public Const serviceUrl As String = "http://localhost/BBInfinityPROD2.7.1633.0/AppFxWebService.asmx"
    Public Const databaseName As String = "BBInfinityPROD2.7.1633.0"
    Public Const applicationTitle As String = "Custom Application"

    Sub Main()
        Dim Form As New Form1
        Form1.ShowDialog()
    End Sub

End Module

When the app starts, Form1.vb appears. The user clicks the Search and Display Constituent as Infinity Form button and btnSearchConstituent_Click is called….

Private Sub btnSearchConstituent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchConstituent.Click
        Try
            Dim SearchResult As BlackbaudInfinityUIHelper.SearchListResult

            'the "Individual Search" feature is used
            SearchResult = BBUIHelper.ShowSearchList("4685952f-6964-486c-9acd-5560a8a30862")

            If Not SearchResult Is Nothing Then
                'Individual Summary View Form
                Me.txtConstituentID.Text = SearchResult.SelectedRecordId
                Me.txtConstitName.Text = SearchResult.SelectedRecordTranslation.ToString
                BBUIHelper.ShowViewDataForm("ce461c96-9a71-4279-a842-6f596956d470", SearchResult.SelectedRecordId)
            End If

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "error")
        End Try
    End Sub

…and a call is made to the BlackbaudInfinityUIHelper.ShowSearchList().

Friend Function ShowSearchList(ByVal SearchListID As String) As SearchListResult
       'to show a data form, use the DataFormWebHostDialog component
       Dim form = New SearchFormWebHostDialog
       form.ServiceUrlBasePath = _serviceUrlBasePath
       form.DatabaseName = _databaseName
       form.ApplicationTitle = _applicationTitle

       'supply credentials to authenticate
       form.Credentials = _credentials

       'indicate the Id of the search form to show (in this example, 
       'the "Constituent Search" feature is used)
       form.SearchListId = New Guid(SearchListID)

       'show the search
       If form.ShowDialog() = Windows.Forms.DialogResult.OK Then

           Return New SearchListResult(form.SelectedRecordId, form.SelectedRecordTranslation)
       Else
           Return Nothing
       End If
   End Function

The search list feature is called and displayed from this third-party/non-Infinity shell application.

After the user selects a constituent, we capture the returned constituent ID and translation (yellow highlight below):

'show the search
        If form.ShowDialog() = Windows.Forms.DialogResult.OK Then

            Return New SearchListResult(form.SelectedRecordId, form.SelectedRecordTranslation)
        Else
            Return Nothing
        End If

The record ID and translation are then displayed on Form1.vb at the top of the form.

Private Sub btnSearchConstituent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchConstituent.Click
        Try
            Dim SearchResult As BlackbaudInfinityUIHelper.SearchListResult

            'the "Individual Search" feature is used
            SearchResult = BBUIHelper.ShowSearchList("4685952f-6964-486c-9acd-5560a8a30862")

            If Not SearchResult Is Nothing Then
                'Individual Summary View Form
                Me.txtConstituentID.Text = SearchResult.SelectedRecordId
                Me.txtConstitName.Text = SearchResult.SelectedRecordTranslation.ToString
                BBUIHelper.ShowViewDataForm("ce461c96-9a71-4279-a842-6f596956d470", SearchResult.SelectedRecordId)
            End If

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "error")
        End Try
    End Sub

Next a View Data Form is opened….

Private Sub btnSearchConstituent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchConstituent.Click
        Try
            Dim SearchResult As BlackbaudInfinityUIHelper.SearchListResult

            'the "Individual Search" feature is used
            SearchResult = BBUIHelper.ShowSearchList("4685952f-6964-486c-9acd-5560a8a30862")

            If Not SearchResult Is Nothing Then
                'Individual Summary View Form
                Me.txtConstituentID.Text = SearchResult.SelectedRecordId
                Me.txtConstitName.Text = SearchResult.SelectedRecordTranslation.ToString
                BBUIHelper.ShowViewDataForm("ce461c96-9a71-4279-a842-6f596956d470", SearchResult.SelectedRecordId)
            End If

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "error")
        End Try
    End Sub

… and BlackbaudInfinityUIHelper.ShowViewDataForm() displays Individual Summary View Form for the selected constituent:

Friend Sub ShowViewDataForm(ByVal DataFormInstanceID As String, ByVal RecordID As String, Optional ByVal ContextRecordID As String = "")
        'to show a data form, use the DataFormWebHostDialog component

        Dim form = New DataFormWebHostDialog
        form.ServiceUrlBasePath = _serviceUrlBasePath
        form.DatabaseName = _databaseName
        form.ApplicationTitle = _applicationTitle

        'supply credentials to authenticate
        'form.Credentials = New System.Net.NetworkCredential("<username>", "<password>", "<domain>")
        ' or
        form.Credentials = _credentials

       'indicate the data form instance Id of the form to show         form.DataFormInstanceId = New Guid(DataFormInstanceID)

        'specify the context record id for "add" forms that required it
        If ContextRecordID Is Nothing Then
        Else
            form.ContextRecordId = ContextRecordID
        End If

        'specify the record id for "edit" or "view" forms that require it
        form.RecordId = RecordID

        form.ShowDialog()

    End Sub

Attachment: DisplayingaSearchList.zip.