다음을 통해 공유


코드에서 직접 매개 변수 설정

이제 CustomersByCity 보고서에 대해 도시 매개 변수 필드에 두 개의 값("Paris" 및 "Tokyo")을 설정할 수 있습니다.

여기에는 몇 가지 코딩 작업이 필요하며 이 과정은 다음과 같이 구분할 수 있습니다.

  • 코드에서 "도시" 매개 변수 필드 이름이 여러 번 사용되므로 이 이름을 대신할 PARAMETER_FIELD_NAME 상수가 필요합니다.
  • 이 자습서의 다른 두 부분에서 현재 값을 매개 변수에 추가하는 코드가 공통적으로 사용되므로 이 코드를 별도의 도우미 메서드로 만듭니다.
  • ConfigureCrystalReports() 메서드 내에서 ArrayList 인스턴스에 "Paris" 및 "Tokyo" 매개 변수를 추가하고 보고서와 ArrayList 인스턴스를 도우미 메서드에 전달하여 처리합니다.

다음 부분에서는 매개 변수 필드에서 기본값을 검색하여 ListBox 컨트롤에 이 값을 설정하는 방법을 설명합니다. 이 방법은 자습서의 마지막 부분에서 새로운 도시를 동적으로 선택하고 새로 선택한 도시를 기반으로 보고서를 필터링할 때 사용합니다.

"기본 매개 변수를 표시하는 ListBox 컨트롤 만들기" 작업으로 이동합니다.

PARAMETER_FIELD_NAME 상수를 만들려면

  1. 이 Web Form 또는 Windows Form에 대한 코드 숨김 클래스로 돌아옵니다.

  2. 클래스 수준에서 새로운 문자열 상수인 PARAMETER_FIELD_NAME을 만들고 값을 "도시"로 설정합니다.

    Private Const PARAMETER_FIELD_NAME As String = "City"
    
    private const string PARAMETER_FIELD_NAME = "City";
    

보고서에서 매개 변수에 현재 값을 추가하는 도우미 메서드를 만들려면

이제 보고서에서 매개 변수에 현재 값을 추가하는 도우미 메서드를 만들 준비가 되었습니다.

  1. 이 Web Form 또는 Windows Form에 대한 코드 숨김 클래스로 돌아옵니다.

  2. 클래스 서명 위에 System.Collections 네임스페이스에 대한 "Imports" [Visual Basic] 또는 "using" [C#] 선언이 없으면 클래스 위에 해당 선언을 추가합니다.

``` vb
Imports System.Collections
```

``` csharp
using System.Collections;
```

<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\e2c9s1d7.alert_note(ko-kr,VS.90).gif" alt="Note" class="note" />참고</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>이 선언은 ArrayList 클래스에 액세스하는 데 필요합니다.</p></td>
</tr>
</tbody>
</table>
  1. 메서드 서명에 ReportDocument 및 ArrayList 두 변수가 있는 SetCurrentValuesForParameterField()라는 private 메서드를 클래스 맨 아래에서 새로 만듭니다.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\e2c9s1d7.alert_note(ko-kr,VS.90).gif" alt="Note" class="note" />참고</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>포함 보고서를 사용한 경우 이 자습서의 후반부에서 포함 보고서 클래스를 ReportDocument 메서드 매개 변수에 전달합니다. 이 작업이 가능한 이유는 Crystal Reports의 모든 포함 보고서 클래스가 ReportDocument 기본 클래스에서 상속되기 때문입니다.</p></td>
</tr>
</tbody>
</table>

``` vb
Private Sub SetCurrentValuesForParameterField(ByVal myReportDocument As ReportDocument, ByVal myArrayList As ArrayList)

End Sub
```

``` csharp
private void SetCurrentValuesForParameterField(ReportDocument reportDocument, ArrayList arrayList)
{
}
```
  1. 이 메서드 내에서 인덱싱된 ParameterValues 클래스를 currentParameterValues 변수로 선언하고 인스턴스화합니다.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\e2c9s1d7.alert_note(ko-kr,VS.90).gif" alt="Note" class="note" />참고</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>ParameterValues 클래스에 액세스하려면 CrystalDecisions.Shared 네임스페이스에 대한 &quot;Imports&quot; [Visual Basic] 또는 &quot;using&quot; [C#] 선언을 코드 숨김 클래스 위에 포함시켜야 합니다. 이 선언은 <a href="ms227453(v=vs.90).md">&quot;프로젝트 설정&quot;</a> 과정에서 추가했습니다.</p></td>
</tr>
</tbody>
</table>

``` vb
Dim currentParameterValues As ParameterValues = New ParameterValues()
```

``` csharp
ParameterValues currentParameterValues = new ParameterValues();
```
  1. ArrayList 인스턴스에서 Object형식으로 제공하는 모든 값을 검색하는 foreach 루프를 만듭니다.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\e2c9s1d7.alert_note(ko-kr,VS.90).gif" alt="Note" class="note" />참고</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>이 메서드는 ArrayList에서 값을 검색합니다. 나중에 ArrayList에 값을 추가하는 코드를 작성합니다.</p></td>
</tr>
</tbody>
</table>

``` vb
For Each submittedValue As Object In myArrayList

Next
```

``` csharp
foreach(object submittedValue in arrayList)
{
}
```
  1. foreach 루프 내에서 ParameterDiscreteValue 클래스를 선언하고 인스턴스화합니다.

    Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue()
    
    ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
    
  2. foreach 루프 안에서 submittedValue를 문자열로 변환하고 ParameterDiscreteValue 인스턴스의 Value 속성에 전달합니다.

    myParameterDiscreteValue.Value = submittedValue.ToString()
    
    parameterDiscreteValue.Value = submittedValue.ToString();
    
  3. foreach 루프 안에서 ParameterDiscreteValue 인스턴스를 인덱싱된 currentParameterValues 클래스에 추가합니다.

``` vb
currentParameterValues.Add(myParameterDiscreteValue)
```

``` csharp
currentParameterValues.Add(parameterDiscreteValue);
```

foreach 루프 내의 코드를 모두 작성했습니다. 이후의 단계에서 만드는 나머지 코드는 foreach 루프 뒤에 배치합니다.
  1. foreach 루프 밖에서 ReportDocument 인스턴스의 DataDefinition 속성에서 인덱싱된 ParameterFieldDefinitions 클래스를 검색합니다.

    Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
    
    ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
    
  2. PARAMETER_FIELD_NAME 상수의 인덱스 항목에 따라 인덱싱된 ParameterFieldDefinitions 클래스에서 ParameterFieldDefinition 인스턴스를 검색합니다.

    Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME)
    
    ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME];
    
  3. ParameterFieldDefinition 인스턴스의 ApplyCurrentValues 메서드에 currentParameterValues 인스턴스를 전달합니다.

    myParameterFieldDefinition.ApplyCurrentValues(currentParameterValues)
    
    parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
    

보고서를 CrystalReportViewer 컨트롤에 바인딩하기 전에 SetCurrentValuesForParameterField () 메서드를 호출하려면

이 단계에서는 ArrayList 인스턴스에서 제공하는 값을 검색하여 ParameterFieldDefinition 인스턴스에 현재 값으로 배치하는 메서드를 만드는 방법을 설명했습니다. 이제 CrystalReportViewer 컨트롤에 보고서를 바인딩하기 전에 보고서에 매개 변수 설정이 있음을 알리기 위해 이 메서드를 호출해야 합니다.

  1. ConfigureCrystalReports() 메서드의 코드에서 보고서를 CrystalReportViewer 컨트롤에 바인딩하는 줄 위에 두 개의 줄 바꿈을 삽입합니다.

    이 줄 바꿈 안에서 뷰어에 보고서를 바인딩하기 전에 보고서를 수정하는 코드를 추가로 입력할 수 있습니다.

  2. 이 두 줄 사이에서 ArrayList를 선언하고 인스턴스화합니다.

    Dim myArrayList As ArrayList = New ArrayList()
    
    ArrayList arrayList = new ArrayList();
    
  3. 도시 이름인 "Paris" 및 "Tokyo"를 ArrayList 인스턴스에 문자열로 추가합니다.

    myArrayList.Add("Paris")
    myArrayList.Add("Tokyo")
    
    arrayList.Add("Paris");
    arrayList.Add("Tokyo");
    
  4. SetCurrentValuesForParameterField() 메서드를 호출하고 CustomersByCityReport 인스턴스와 ArrayList 인스턴스를 전달합니다.

    SetCurrentValuesForParameterField(customersByCityReport,
    myArrayList)
    
    SetCurrentValuesForParameterField(customersByCityReport,
    arrayList);
    

CustomersByCity 보고서가 로드되는지 테스트하려면

메서드 코드의 마지막 줄은 보고서를 CrystalReportViewer 컨트롤에 바인딩하는 코드입니다.

이제 프로젝트를 빌드하고 실행할 준비가 되었습니다. 이제 현재 값을 매개 변수 필드로 설정하는 코드를 작성했으므로 보고서가 성공적으로 표시되어야 합니다.

  1. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

  2. 빌드 오류가 발생하면 바로 수정합니다.

  3. 디버그 메뉴에서 시작을 클릭합니다.

    이제 CustomersByCity 보고서가 표시되고 파리와 도쿄에 살고 있는 고객 목록이 나타납니다.

  4. Visual Studio로 돌아간 다음 중지를 클릭하여 디버그 모드를 종료합니다.