Curl Global Community
RecordGrid 列の表示/非表示について - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: RecordGrid 列の表示/非表示について (/showthread.php?tid=1224)



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
  }