ComponentOne Reports for WinForms Designer Edition: Using the C1ReportDesigner Control > Step 9 of 9: Add Code to Create Fields

Step 9 of 9: Add Code to Create Fields

The simple designer is almost done; it is only missing the code used to create new fields in the report.

If you look at the code we are using for the toolbar event handler, you will see that it set the CreateFieldInfo property on the designer and says to wait for the CreateField event from the designer.

Add the following code to create new fields in the report:

      Visual Basic

' handle clicks on toolbar buttons

Private Sub _tb_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles _tb.ButtonClick

   ' …

   ' add fields

   ' (just set create info and wait for CreateField event from designer)

   If e.Button.Equals(_btnAddField) Then

      _c1rd.CreateFieldInfo = e.Button

   If e.Button.Equals(_btnAddLabel) Then

      _c1rd.CreateFieldInfo = e.Button

End Sub

      C#

// handle clicks on toolbar buttons

private void _tb_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)

{

    // …

 

    // add fields

    // (just set create info and wait for CreateField event from designer)

    if (e.Button == _btnAddField)    _c1rd.CreateFieldInfo = e.Button;

    if (e.Button == _btnAddLabel)    _c1rd.CreateFieldInfo = e.Button;

}

The CreateFieldInfo property can be set to any non-null object to indicate to the designer that you want to create a new field. The designer doesn't know what type of field you want to create or how you want to initialize it, so it tracks the mouse and allows the user to draw the field outline on a section. It then fires the CreateField event passing the information you need to create the field yourself.

Add the following code to handle the CreateField event:

      Visual Basic

Dim _ctr As Integer

 

Private Sub _c1rd_CreateField(ByVal sender As Object, ByVal e As C1.Win.C1ReportDesigner.CreateFieldEventArgs) Handles _c1rd.CreateField

   ' save undo info

   _c1rd.UndoStack.SaveState()

  

   ' add label field

   _ctr = _ctr + 1

   Dim fieldName As String = String.Format("NewField{0}", _ctr)

   Dim fieldText As String = fieldName

   Dim f As Field = e.Section.Fields.Add(fieldName, fieldText, e.FieldBounds)

  

   ' if this is a calculated field,

   ' change the Text and Calculated properties

   If e.CreateFieldInfo.Equals(_btnAddField) Then

      Dim fieldNames As String() = _c1rd.Report.DataSource.GetDBFieldList(True)

      If (fieldNames.Length > 0) Then

         f.Text = fieldNames(0)

         f.Calculated = True

      End If

   End If

End Sub

      C#

int _ctr = 0;

private void _c1rd_CreateField(object sender,

        C1.Win.C1ReportDesigner.CreateFieldEventArgs e)

{

    // save undo info

    _c1rd.UndoStack.SaveState();

 

    // add label field

    string fieldName = string.Format("NewField{0}", ++_ctr);

    string fieldText = fieldName;

    Field f = e.Section.Fields.Add(fieldName, fieldText, e.FieldBounds);

 

    // if this is a calculated field,

    // change the Text and Calculated properties

    if (e.CreateFieldInfo == _btnAddField)

    {

        string[] fieldNames = _c1rd.Report.DataSource.GetDBFieldList(true);

        if (fieldNames.Length > 0)

        {

            f.Text = fieldNames[0];

            f.Calculated = true;

        }

    }

}

Note how the code starts by calling the SaveState method on the designer, so the user can undo the field creation. After that, the field is created, and the CreateFieldInfo parameter is used to customize the new field and make it behave as a label or as a calculated field.

That concludes the simple designer application: an introduction to the operation of the C1ReportDesigner control.


Send comments about this topic to ComponentOne.
Copyright © ComponentOne LLC. All rights reserved.