RecordGrid 列の表示/非表示について - Yudai-s - 05-19-2015
RecordGridの列の表示/非表示の制御をコンテキストメニューから行いたいと考えておりますが、実装方法で苦戦しております。
コンテキストメニューから指定した列を表示/非表示にできるようなプロパティやメソッド等ありますでしょうか。
※最終的には下記のようになるのが理想です。
===========
・コンテキストメニューに「表示」「非表示」を追加
・「表示」「非表示」にフォーカスを当てると、
RecordGridの列名が表示され、指定した列が
表示または非表示になる。
===========
以上、よろしくお願いいたします。
RE: RecordGrid 列の表示/非表示について - dankom - 05-19-2015
残念ながら標準でコンテキストメニューで列の表示/非表示を制御するものはないんじゃないでしょうか。
しかし、RecordGridUIにcontext-menu-atメソッドがあります。
このメソッドをオーバーライドすることでコンテキストメニューを改変できます。
ここを実装することで実現できるんではないでしょうか
Code: {define-class public MyRecordGridUI {inherits SkinnableRecordGridUI}
{constructor public {default ...}
{construct-super ...}
}
{method public {context-menu-at x:Distance, y:Distance}:#MenuPane
let mp:#MenuPane = {super.context-menu-at x, y}
{mp.add
{SubMenu label = "表示",
{MenuAction
label = "abc",
{on Action do
{dump "abc"}
}
},
{MenuAction
label = "def",
{on Action do
{dump "def"}
}
}
}
}
{mp.add
{SubMenu label = "非表示",
{MenuAction
label = "123",
{on Action do
{dump "123"}
}
},
{MenuAction
label = "456",
{on Action do
{dump "456"}
}
}
}
}
{return mp}
}
}
{value
{RecordGrid
ui-object = {MyRecordGridUI},
record-source =
{RecordSet
{RecordFields
{RecordField
"First", caption = "First Name", domain = String
},
{RecordField
"Last", caption = "Last Name", domain = String
},
{RecordField "Age", domain = int}
},
{RecordData First = "John", Last = "Smith", Age = 25},
{RecordData First = "Jane", Last = "Smith", Age = 29},
{RecordData First = "Jane", Last = "Jones", Age = 28}
},
height = 3cm
}
}
RE: RecordGrid 列の表示/非表示について - Yudai-s - 05-19-2015
>dankom様
教えていただいたソースをもとに実装し、コンテキストメニューへの「表示」「非表示」の追加と列の表示/非表示を実装することができました。
ありがとうございました。
Code: {method public {context-menu-at x:Distance, y:Distance}:#MenuPane
let menu-pane:#MenuPane = {super.context-menu-at x, y}
let disp-list:{Array-of MenuAction} = {new {Array-of MenuAction}}
let hide-list:{Array-of MenuAction} = {new {Array-of MenuAction}}
|| RecordFieldからコンテキストメニューに表示する列名を取得
{if-non-null self.grid.record-source then
{for field in self.grid.record-source.fields do
{disp-list.append {MenuAction
label = field.caption,
{on Action do
{self.disp-columns field.name}
}
}
}
{hide-list.append {MenuAction
label = field.caption,
{on Action do
{self.hide-columns field.name}
}
}
}
}
}
{menu-pane.add
{SubMenu label = "表示",
{splice disp-list}
}
}
{menu-pane.add
{SubMenu label = "非表示",
{splice hide-list}
}
}
{return menu-pane}
}
||############################################################
|| 選択した列を表示する
||############################################################
{method private {disp-columns column-name:String}:void
let disp-column-list:{Array-of BaseRecordGridColumn} = {new {Array-of BaseRecordGridColumn}}
let insert-index:int = {self.grid.record-source.fields.get-index column-name}
let column-index:int = 0
let is-insert?:bool = false
|| 現在表示されている列を取得する
{for column in self.grid.columns do
|| 指定した列がすでに表示されている場合は何もせず終了
{if column.field-name == column-name then {return}}
{if column-index == insert-index then
|| 指定した列を追加する
{disp-column-list.append
{RecordGridColumn
column-name
}
}
set is-insert? = true
}
{disp-column-list.append
i
}
set column-index = column-index + 1
}
{if is-insert? == false then
|| 指定した列を追加する
{disp-column-list.append
{RecordGridColumn
column-name
}
}
}
set self.grid.base-columns = disp-column-list
}
||############################################################
|| 選択した列を非表示にする
||############################################################
{method private {hide-columns column-name:String}:void
let disp-column-list:{Array-of BaseRecordGridColumn} = {new {Array-of BaseRecordGridColumn}}
|| 現在表示されている列を取得する
{for column in self.grid.columns do
|| 選択した列以外を表示列として設定する
{if column.field-name != column-name then
{disp-column-list.append
column
}
}
}
set self.grid.base-columns = disp-column-list
}
|