3

2 つの列が DateTime スタイルである多くの列がある UltraGrid があります。その列のフィルターを使用すると、すべての DateTime 値がドロップダウンのテキストとして表示されます。しかし、フィルターを簡単にするために、カレンダーとしてそれが必要です。フィルターをクリックしてカレンダーを表示するだけで十分です。

いくつかのコードを試しましたが、うまくいきません。

//コード:

Private Sub grdResult_BeforeRowFilterDropDown(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.BeforeRowFilterDropDownEventArgs) Handles grdResult.BeforeRowFilterDropDown
                e.Cancel = True
                UltraCalendarCombo1.Visible = True
               UltraCalendarCombo1.Location = New Point(grdResult.Rows.FilterRow.Cells(e.Column).GetUIElement().Rect.Location.X, grdResult.Rows.FilterRow.Cells(e.Column).GetUIElement().Rect.Location.Y - 2)
                UltraCalendarCombo1.Size = New System.Drawing.Size(grdResult.Rows.FilterRow.Cells(e.Column).GetUIElement().Rect.Size.Width, grdResult.Rows.FilterRow.Cells(e.Column).GetUIElement().Rect.Size.Height)
                ' UltraCalendarCombo1.DroppedDown = True

            End Sub

上記のイベントは、フィルター ドロップダウンがクリックされると発生します。

    private sub applyCustomeViewSettings(byval gridFormat as GridFormat)
    ....
    ...
       For Each ColumnFormat In gridFormat.ColumnFormats

                    For Each column In Me.grdResult.DisplayLayout.Bands(0).Columns

                        If column.Key.ToUpper = ColumnFormat.ColumnKey.ToUpper Then
                            If column.Key.ToUpper = "PCSSTDT" Then
                                column.Header.Caption = IIf(ColumnFormat.Caption = "", ColumnFormat.ColumnKey, ColumnFormat.Caption)
                                column.Hidden = ColumnFormat.Hidden
                                'column.AllowRowFiltering = IIf(ColumnFormat.AllowRowFiltering = False, ColumnFormat.AllowRowFiltering, DefaultableBoolean.True) 'CType(ColumnFormat.AllowRowFiltering, DefaultableBoolean)
                                column.Width = ColumnFormat.Width
                                column.Header.VisiblePosition = ColumnFormat.VisiblePosition
                                column.Format = ColumnFormat.Format
                                column.SortIndicator = ColumnFormat.SortIndicator
                                ' column.Style = ColumnStyle.Date
                                'column.EditorComponent = UltraCalendarCombo1
                                column.FilterOperandStyle = FilterOperandStyle.Default

                            Else
                                column.Header.Caption = IIf(ColumnFormat.Caption = "", ColumnFormat.ColumnKey, ColumnFormat.Caption)
                                column.Hidden = ColumnFormat.Hidden
                                column.AllowRowFiltering = IIf(ColumnFormat.AllowRowFiltering = False, ColumnFormat.AllowRowFiltering, DefaultableBoolean.True) 'CType(ColumnFormat.AllowRowFiltering, DefaultableBoolean)
                                column.Width = ColumnFormat.Width
                                column.Header.VisiblePosition = ColumnFormat.VisiblePosition
                                column.Format = ColumnFormat.Format
                                column.SortIndicator = ColumnFormat.SortIndicator
                                column.Style = ColumnFormat.Style
                            End If
                        End If

                    Next
    ....
    ...

    End Sub

上記のメソッドは、フィルターをカレンダーとして表示するようにグリッドを変更 (設定を適用) します。しかし、これは機能せず、同じ通常のグリッドが表示されます。

どうすればこれを達成できますか?

4

1 に答える 1

4

MonthCalendarアイコンを押して UltraWinGrid の DateTime 列をフィルタリングすると、を表示することができました。
が表示されたら、MonthCalendarこの標準の WinForm コントロールによって提供される使い慣れたインターフェイスを使用して、特定の日付を選択できます。日付を選択した後、その値を使用してプログラムでフィルター条件を UltraWinGrid 列に適用できます。

この結果に到達するには、まず、 UltraGridFilterUIProviderクラスを見つけることができるInfragistics4.Win.SupportsDialog.v11.2アセンブリへの参照を追加する必要があります。

ここで、フィルタリングを表示する必要があるフォームで、次のコードを追加します。

Imports Infragistics.Win.UltraWinGrid
Imports Infragistics.Win.SupportDialogs.FilterUIProvider

Public Class Form1
    ' This is the key object that let us customize ' 
    ' the Filter for the UltraWinGrid'
    Dim _filterUIProvider as UltraGridFilterUIProvider

    ' In the InitializeLayout event we substitute the normal 
    ' filter handler with the custom filter'
    Private Sub UltraGrid1_InitializeLayout(sender As Object, e As Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs) Handles UltraGrid1.InitializeLayout

        e.Layout.Override.AllowRowFiltering = Infragistics.Win.DefaultableBoolean.True
        _filterUIProvider = New UltraGridFilterUIProvider()

        ' Comment out the following line to test the default 
        ' **Excel Filter Style Interface** '
        AddHandler _filterUIProvider.BeforeMenuPopulate, AddressOf _filterUIProvider_BeforeMenuPopulate
        e.Layout.Override.FilterUIProvider = _filterUIProvider
    End Sub

    ' Before the UltraGridFilterUIProvider shows its standard form interface 
    ' we start a custom form  used to apply our filtering logic '
    ' and block the display of the UltraGridFilterUIProvider interface '
    Private Sub _filterUIProvider_BeforeMenuPopulate(sender As Object, e As Infragistics.Win.SupportDialogs.FilterUIProvider.BeforeMenuPopulateEventArgs)

        ' A custom form with the MonthCalendar and 3 buttons '
        ' to handle the filter logic '
        Using fDate = new FormDate() 

            ' Open our custom form with the monthcalendar
            if (DialogResult.OK = fDate.ShowDialog())  

                ' We need a nullable date to allow the removing of the filter'
                Dim dtFilter As DateTime? = fDate.SelectedDate
                if (dtFilter.HasValue)

                    ' Apply programmatically a filtercondition to the column 
                    ' In this case I have only one column. so I use the index 0
                    ' in your case this should change to reflect your column index
                    Dim fc = new FilterCondition(FilterComparisionOperator.Equals, dtFilter.Value)
                    ultraGrid1.DisplayLayout.Bands(0).ColumnFilters(0).FilterConditions.Add(fc)

                Else
                    ultraGrid1.DisplayLayout.Bands(0).ColumnFilters.ClearAllFilters()
                End If
            End If
        End Using
        e.Handled = true ' Stop the standard interface'
    End Sub
End Class

ここで必要なのは、MonthCalendar と 3 つのボタン (Set、Clear、Cancel) を含むFormDateという単純なフォームだけです。これらのボタンは、(Set) フィルターを設定する Date、(Clear) 前のフィルターを削除する null 値、およびキャンセル ボタンを返します。処理を中止します

ここにフォームのコード、デザインは簡単です

Public Class FormDate
    Public Property SelectedDate As DateTime?

    Private Sub FormDate_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.SelectedDate = Nothing
    End Sub

    Private Sub cmdSet_Click(sender As Object, e As EventArgs) Handles cmdSet.Click
        'This button has DialogResult=OK'
        Me.SelectedDate = monthCalendar1.SelectionStart
    End Sub

    Private Sub cmdClear_Click(sender As Object, e As EventArgs) Handles cmdClear.Click
        'This button has DialogResult=OK'
        Me.SelectedDate = Nothing
    End Sub
End Class

これで問題が解決する可能性がありますが、UltraGridFilterUIProvider のバグと思われるものを発見しました。e.Handled=Trueを呼び出すと、期待される結果はフィルターで何も表示されませんが、代わりに小さなウィンドウが表示され、Escape を押して非表示にする必要があります。自動的に非表示にする方法が見つかりませんでした。
Infragistics チームに通知するのは問題のようです。

UltraGridFilterUIProvider によって自動的に提供されるExcel スタイル フィルター インターフェイスもテストすることをお勧めします。このインターフェイスには多くのオプションがあり、標準の UI フィルターよりもはるかに適しています。このインターフェイスをテストするには、上記の AddHandler 行のみをコメントアウトする必要があります

編集@Alhalama からのコメントに続いて、BeforeRowFilterDropDown イベントを使用しようとしましたが、結果はより良くなりました (今では完璧です)。そのため、AddHandler の行をコメントアウトし、BeforeMenuPopulate のコードを削除して、BeforeRowFilterDropDown のコードを追加しました。

Private Sub UltraGrid1_BeforeRowFilterDropDown(sender As Object, e As BeforeRowFilterDropDownEventArgs) Handles UltraGrid1.BeforeRowFilterDropDown
    If e.Column.Key = "DateRequest" Then
        Using fDate = New FormDate()
            If DialogResult.OK = fDate.ShowDialog() Then
                Dim dtFilter As DateTime? = fDate.SelectedDate
                If (dtFilter.HasValue) Then
                    Dim fc As FilterCondition = New FilterCondition(FilterComparisionOperator.Equals, dtFilter.Value)
                    UltraGrid1.DisplayLayout.Bands(0).ColumnFilters(0).FilterConditions.Add(fc)
                Else
                    UltraGrid1.DisplayLayout.Bands(0).ColumnFilters.ClearAllFilters()
                End If
            End If
        End Using
        e.Cancel = True
    End If
End Sub

ここで、DateRequest という名前の列のフィルターを開こうとすると、すぐにFormDate を開き、最後に BeforeRowFilterDropDownEventArgs の Cancel プロパティを true に設定して、フィルター ダイアログのさらなる処理を回避します。これは完璧に思えます...... これは Alhalama 氏の功績によるものです。あなたの提案が本当に違いを生むので、あなたが望むなら、あなた自身の答えを投稿するべきだと思います。

于 2013-08-02T13:38:00.413 に答える