DOBON.NET DOBON.NETプログラミング掲示板過去ログ

outlookgridの使い方

環境/言語:[xp vb.net]
分類:[.NET]

お世話になります。
http://dobon.net/vb/dotnet/datagridview/grouping.html
のoutlookgridをvb2008にて使用したいと考えているのですが
使い方がわかりません。

ダウンロードしたフォルダを何処に置くのか、
など詳しく教えていただけないでしょうか。
よろしくお願いします。
使い方までは分かりませんが、「Download control only」というのをダウンロードすると、中からDLLが出てきますので、これを参照設定に追加することで使えるようにならないでしょうか?
管理人さん、ありがとうございます。
ツールボックスにコントロールの出現を確認できました。

サンプルのように動作させるには
ある程度のコーディングが必要なのでしょうか?

http://www.codeproject.com/KB/grid/OutlookGrid.aspx
のサンプルコードの言語はC#でしょうか?
これを使ってVB.netに実装するのは可能でしょうか?

引き続き、お付き合いください。
申し訳ありませんが、私はこのコントロールについて詳しいわけではありませんので、使い方をお教えできる立場にありません。

C#のコードをVB.NETに変換する方法は、

C#のコードをVB.NETへ変換する
http://dobon.net/vb/dotnet/links/convertcs2vb.html

で説明していますので、試してみてください。
管理人さん、ありがとうございます。

変換してこのコントロールが使用できるとすれば助かります。
教えていただいたサイトにて変換してみました。

Dim ColumnIndex As Integer = 2
outlookGrid1.GroupTemplate = New OutlookGridAlphabeticGroup()
outlookGrid1.GroupTemplate.Column = outlookGrid1.Columns(ColumnIndex)
outlookGrid1.GroupTemplate.Column.Collapsed = True
outlookGrid1.Sort(New DataRowComparer(ColumnIndex, direction))

しかし上記の2・4・5行でエラーが発生してしまいます。
やはり変換したコードをそのままでは動かないみたいです。

修正点などお気づきのところがあればご指摘いただければ幸いです、
よろしくお願いします。
「書き込みのルールについて」にありますが、どのようなエラーが発生したのかを明記してください。もしまだ「書き込みのルールについて」をお読みでなければ、一度目をお通しください。よろしくお願いいたします。

書き込みのルールについて
http://dobon.net/vb/bbs/index.html
管理人さん、ありがとうございます。
マナー違反、申し訳ありませんでした。

エラーの状況をご説明します。
OutlookGridのDLLを参照設定に追加し、
まず、新規のフォームにツールボックスから
OutlookGridを配置しました。
次に、Button1を配置し、下記のコードを設定しました。

Dim ds As DataSet = New DataSet("dst")
Dim dt As DataTable = New DataTable("dtb")
ds.Tables.Add(dt)

dt.Columns.Add("date", GetType(DateTime))
dt.Columns.Add("id", GetType(Integer))
dt.Columns.Add("name", GetType(String))

Dim dr As DataRow
dr = dt.NewRow()
dr("date") = "2009/07/17"
dr("id") = 1
dr("name") = "jaco"
dt.Rows.Add(dr)

OutlookGrid1.BindData(ds, "dtb")

    ' ここから変換したコード
Dim ColumnIndex As Integer = 1

1 → OutlookGrid1.GroupTemplate = New OutlookGridAlphabeticGroup()
2 → OutlookGrid1.GroupTemplate.Column = OutlookGrid1.Columns(ColumnIndex)
   OutlookGrid1.GroupTemplate.Column.Collapsed = True
3,4 → OutlookGrid1.Sort(New DataRowComparer(ColumnIndex, direction))


エラー 1 型 'OutlookGridAlphabeticGroup' が定義されていません。
エラー 2 'Collapsed' は 'System.Windows.Forms.DataGridViewColumn' のメンバではありません。
エラー 3 型 'System.Data.DataRowComparer' にはコンストラクタがありません。
エラー 4 名前 'direction' は宣言されていません。

このように4つのエラーが出てしまいます。
どのように考えたらいいのでしょうか。
よろしくお願いいたします。
> 1 → OutlookGrid1.GroupTemplate = New OutlookGridAlphabeticGroup()

OutlookGridAlphabeticGroupの名前空間はImports等でインポートされているのでしょうか?そうでなければ、名前空間をつける必要があります。

> 2 → OutlookGrid1.GroupTemplate.Column = OutlookGrid1.Columns(ColumnIndex)
>    OutlookGrid1.GroupTemplate.Column.Collapsed = True

たぶん「OutlookGrid1.GroupTemplate.Collapsed」のような気がします。どのクラスにCollapsedプロパティがあるかを調べてみてください。

> 3,4 → OutlookGrid1.Sort(New DataRowComparer(ColumnIndex, direction))

DataRowComparerは定義されていますか?また、directionという変数は宣言されていますか?
管理人さん、ありがとうございます。

>名前空間をつける必要があります。
Imports OutlookStyleControlsでエラーは消えました。

> たぶん「OutlookGrid1.GroupTemplate.Collapsed」のような気がします。
そのとおりでした。変更後、エラーは消えました。

> DataRowComparerは定義されていますか
私なりに検索してみて
Public NotInheritable Class DataRowComparer
End Class
という風にしてみました。
とりあえずエラーは消えたみたいですけど。
>また、directionという変数は宣言されていますか?
こちらも手探りですが
Imports System.ComponentModel

Public Overridable Sub Sort(ByVal ColumnIndex As DataGridViewColumn, ByVal direction As ListSortDirection)
End Sub
さらに
Dim direction As ListSortDirection
としました。

これまでのエラー箇所は消えましたが
新たに
ColumnIndex, direction
の部分に
Public Sub New()'に対しての引数が多すぎます。
とエラーが出てしまいました。

このあたりの解説もお願いできませんでしょうか?
よろしくお願いします。
■No24982に返信(jacoさんの記事)
>>> 3,4 → OutlookGrid1.Sort(New DataRowComparer(ColumnIndex, direction))
ここで
 New DataRowComparer(ColumnIndex, direction)
と書かれているのですから、DataRowComparer クラスには
引数二つを受け取る「コンストラクタ」(VBでは Sub New)が
実装されていなければなりません。


> Public NotInheritable Class DataRowComparer
> End Class
> という風にしてみました。
空っぽでは駄目でしょう。中身も実装しないといけないと思いますよ。

OutlookGrid とやらを試してみた事は無いので、詳しくは説明できませんが、
多分、DataGridView.Sort と同じような実装になっているのだと思います。

# ちなみに DataGridView の Sort メソッドは、
#  Sort(DataGridViewColumn, ListSortDirection)
#  Sort(IComparer)
# の 2 種類があります。OutlookGrid の実装状況は知りませんが。


で、もしも DataGridView.Sort と同じような実装なのだと仮定すると、
その DataRowComparer というクラスは、ソート時の「比較方法」を
カスタマイズするための物なのだと思われます。

恐らくは IComparer インターフェイス(またはそのジェネリック版)を
Implements し、Compare メソッドを実装する必要があるのではないかと。
http://www.codeproject.com/KB/grid/OutlookGrid.aspx

にアップロードされているソースはご覧になりましたか?これを見てみましたが、Form1にDataRowComparerクラスが定義されています。ソースをダウンロードして、Form1を調べてみてはいかがでしょうか?
魔界の仮面弁士 ファミリーさん、
管理人さん、ありがとうございます。

>恐らくは IComparer インターフェイス(またはそのジェネリック版)を
>Implements し、Compare メソッドを実装する必要があるのではないかと。
>Form1にDataRowComparerクラスが定義されています。ソースをダウンロード
>して、Form1を調べてみてはいかがでしょうか?

Public Class DataRowComparer
Implements IComparer
Private direction As ListSortDirection
Private columnIndex As Integer

Public Sub New(columnIndex As Integer, direction As ListSortDirection)
Me.columnIndex = columnIndex
Me.direction = direction
End Sub

Public Function Compare(x As Object, y As Object) As Integer
Dim obj1 As DataRow = CType(x, DataRow)
Dim obj2 As DataRow = CType(y, DataRow)
Return String.Compare(obj1(columnIndex).ToString(), obj2(columnIndex).ToString()) *(If direction = ListSortDirection.Ascending Then 1 Else - 1)
End Function
End Class

この部分でしょうか?
しかし、
*(If direction = ListSortDirection.Ascending Then 1 Else - 1)

Ifには
『'if' 演算子には2つまたは3つのオペランドが必要です。』
directionには
『'('が必要です。』
といったエラーが出てしまいました。
'('に関してはいろいろと試してみましたがエラーは消えませんでした。

引き続き、ご教授願います。
■No24985に返信(jacoさんの記事)
> *(If direction = ListSortDirection.Ascending Then 1 Else - 1)
If 演算子として実装するのであれば、
 Return String.Compare(obj1(columnIndex).ToString(), obj2(columnIndex).ToString())) _
    * If(direction = ListSortDirection.Ascending, 1, - 1)
で、If ステートメントとして実装するのであれば、
 If direction = ListSortDirection.Ascending Then
  Return String.Compare(obj1(columnIndex).ToString(), obj2(columnIndex).ToString())
 Else
  Return -String.Compare(obj1(columnIndex).ToString(), obj2(columnIndex).ToString())
 End If
だと思います。
魔界の仮面弁士さん、ありがとうございます。
ご指摘どおりでした。
Public Class DataRowComparer
Implements IComparer
Private direction As ListSortDirection
Private columnIndex As Integer
Public Sub New(ByVal columnIndex As Integer, ByVal direction As ListSortDirection)
Me.columnIndex = columnIndex
Me.direction = direction
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim obj1 As DataRow = CType(x, DataRow)
Dim obj2 As DataRow = CType(y, DataRow)
Return String.Compare(obj1(columnIndex).ToString(), obj2(columnIndex).ToString()) * If(direction = ListSortDirection.Ascending, 1, -1)
End Function
End Class
でエラーは消え、OutlookGridに求める動作をしてくれました。
ただ、折りたたんだり開いたりするときのアイコン、
「+」や「-」が表示されませんでした。
プロパティやForm1を見てみましたが
それらしき設定可能な箇所を見つけることができませんで。

もう少しだけご教授お願いしたいです。
よろしくお願いします。
いろいろと調べていて
Form1.Designer.vbに下記のようにありました。

Me.OutlookGrid1.CollapseIcon = Nothing
Me.OutlookGrid1.ExpandIcon = Nothing

関連しているかは不明でしたが、
Form1.Designer.csを教えていただいたサイトにて変換してみました。
Me.OutlookGrid1.CollapseIcon = DirectCast((Resources.GetObject("OutlookGrid1.CollapseIcon")), System.Drawing.Image)
Me.OutlookGrid1.ExpandIcon = DirectCast((Resources.GetObject("OutlookGrid1.ExpandIcon")), System.Drawing.Image)

そのまま貼り付けてみましたが
Resources.GetObjectのところに
'GetObject'は'Resources'のメンバではありません。
とエラーが出ました。

どのように考えたらいいのでしょうか?
よろしくお願いします。
Form1.resxにリソースが埋め込まれているのではないでしょうか?適当な画像を自分で用意して、フォームデザイナでOutlookGrid1のCollapseIconとExpandIconプロパティに指定してみてはいかがでしょうか?
管理人さん、ありがとうございます。

>フォームデザイナでOutlookGrid1のCollapseIconとExpandIconプロパティに
>指定してみてはいかがでしょうか?
おかげさまでアイコンを表示させることに成功しました。

outlookgridに関しては皆様には感謝いたします。
お付き合いくださいましてありがとうございました。

またよろしくお願いします。
とりあえず、解決とさせていただきます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板