Curl Global Community
RecordGrid でDropdownList を表示 - 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 でDropdownList を表示 (/showthread.php?tid=157)

Pages: 1 2


RecordGrid でDropdownList を表示 - umemura - 07-26-2011

RecordGrid の中で、DropdownList を利用するにはどうすればいいのでしょうか。



RE: RecordGrid でDropdownList を表示 - umemura - 07-26-2011

RecordSet のRecordField のdomain をenum(列挙型)で指定すれば簡単にRecordGridの中でDropdownListが使えるのが分かりました。

ただ、これだと、列挙型のvalue ではなく、name がリストアイテムになってしまいます。(valueをリストアイテムにしたい)

また、動的にリストアイテムを変更することもできません。



そこで、StandardDropdownCel を継承して新しいカスタムセルを作ろうと思ったのですが、

リストアイテムをどのように追加すれば良いか分かりません。



分かる方がいたら教えてください。



RE: RecordGrid でDropdownList を表示 - hmino - 07-27-2011

domainにStandardStringDomainなどを使い方法はためしましたか?
デフォルトコンストラクタのパラメータのallowable-valueにリストに出したい値を設定すればドロップダウンリストとして出力されますよ。
Code:
{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "First", domain = String},
            {RecordField "Last", domain = {StandardStringDomain
                                                  default-value = "",
                                                  allowable-values = {{Array-of String}
                                                                         "","Mino","Okada","Mori"
                                                                     }
                                              }
            },
            {RecordField "Age", domain = int}
        },
        {RecordData First = "Monta", Last = "", Age = 18},
        {RecordData First = "Hitoshi", Last = "", Age = 20},
        {RecordData First = "Akira", Last = "", Age = 40}
    }
}
{value
    {RecordGrid
        record-source = people,
        height = 3cm
    }
}





RE: RecordGrid でDropdownList を表示 - umemura - 08-16-2011

(07-27-2011, 02:22 PM)hmino Wrote: domainにStandardStringDomainなどを使い方法はためしましたか?
デフォルトコンストラクタのパラメータのallowable-valueにリストに出したい値を設定すればドロップダウンリストとして出力されますよ。



StandardStringDomain の使い方を教えていただき、ありがとうございました。

ただ、提示いただいた方法では、グリッド上で指定した値がそのままレコードの値となると認識しています。

列挙型のname と value を、DropdownList のlabel とvalue に対応させるイメージで考えていたので、
下記のように実装してみました。

少しformatメソッドの記述方法が煩雑になっているので、
もっと簡潔な方法があれば教えてください。

Code:
||列挙体を RecordGrid (ReocrdSet)で利用するためのドメインクラス
{define-class public EnumDomain
  {inherits StandardStringDomain}
  
  field enum-type:EnumType
  
  {constructor public {default
                          enum-type:EnumType
                      }
    
    set self.enum-type = enum-type
    
    def ary-string:{Array-of String} = {new {Array-of String}}
    
    ||「指定なし」用のvalueを追加
    {ary-string.append ""}
    
    {with-compiler-directives allow-any-calls? = true do
        
        {for e in self.enum-type do
            
            {ary-string.append (e.name asa String)}
            || {ary-string.append  e.value asa String}
        }
    }
    
    {construct-super
        default-value = "",
        allowable-values = ary-string
        
    }
  }
  
  {method public {format x:any}:String
    
    
    {switch x
        
     case "" do
        {return "指定しない"}
        
     else
       || {return x asa String }
        let return-val:String = ""
        
        def val = {self.enum-type.new-from-name
                      (x asa String)
                  }
        {with-compiler-directives
            allow-implicit-any-casts?  = true,  
            allow-any-calls? = true
         do
            set return-val = val.value
        }
        
        {return return-val }
    }
  }
  
  
}



RE: RecordGrid でDropdownList を表示 - nmyzk - 08-17-2011


enum型を使うのではどうでしょうか?

Code:
{define-enum Bear
    polar = "endangered",
    grizzly = "threatened",
    panda = "cute",
    pooh = "abundant"
}
{let f:Frame = {Frame}}
{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField
                "First", domain = Bear
            },
            {RecordField
                "Last", domain = String, default-value = "LAST"
            },
            {RecordField
                "Age", domain = int, default-value = 99
            }
        },
        {RecordData First = Bear.polar, Last = "Smith", Age = 25},
        {RecordData First = Bear.polar, Last = "Smith", Age = 29},
        {RecordData First = Bear.polar, Last = "Jones", Age = 28},
        {on e:RecordModified do
            {f.add (e.record["First"] asa Bear).value,replace? = true}||ここで値が取れる
        }
    }
}
{let rg:RecordGrid =
    {RecordGrid
        height = 3cm, width = 10cm, record-source = people
    }
}
{value
    {VBox
        rg,
        f
    }        
}



RE: RecordGrid でDropdownList を表示 - umemura - 12-24-2013

列挙体や、StandardStringDomain の allowable-value を使う方法では、
マスタから区分の一覧を取得して、その一覧をリストに表示する、
といった、動的なリストの生成が難しいと思っています。
(RecordField.domain が後で変更可能であれば良いのですが・・・)

また、DropdownList のリストアイテムに ListValueitem を利用して、
コードとラベルを分けて表示する、ということが出来ません。

create-editor で、生成された DropdownList にアイテムを設定する方法だと、
下記のような感じになるかと思います。


Code:
{define-class public CustomDropdownCell {inherits StandardDropdownCell}
  ||DropdownList のリストアイテム
  field public list-items:{Array-of ListValueItem} = {new {Array-of ListValueItem}}
  {constructor public {default
                          list-items:#{Array-of ListValueItem} =null
                      }
    {if-non-null list-items then
        set self.list-items = list-items
    }
    {construct-super}
  }
  ||ドロップダウンリストに、アイテムを設定
  {method public {create-editor}:DropdownList
    def cell-dl = {super.create-editor}
    {for itm in self.list-items do
        {cell-dl.append itm}
    }
    {return cell-dl}
  }
  ||リストで選択されたアイテムのラベルを文字列として取得
  {method public {format x:any}:String
    let txt:String = ""
    def val = {self.get-data}
    def found-index =
    {self.list-items.find
        {ListValueItem val},
        equality-proc =
            {proc {itm1:ListValueItem, itm2:ListValueItem}:bool
                {if itm1.init-value == itm2.init-value then
                    {return true}
                 else
                    {return false}
                }
            }
    }
    {if found-index > -1 then
        def select-item = {self.list-items.get found-index}
        set  txt = {select-item.get-text}

    }
    {return txt}
  }
}
{define-class public CustomDropdownColumn {inherits RecordGridColumn}
  {constructor public {default
                          list-items:#{Array-of ListValueItem} =null,
                          ...}
    {construct-super {splice ...}}
    set self.cell-spec =
        {proc {col:RecordGridColumn}:RecordGridCell
            def cell = {CustomDropdownCell list-items = list-items}
            {return cell}
        }
  }
}
{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "First", domain = String},
            {RecordField "Last", 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}
    }
}
{def grid =
    {RecordGrid
        record-source = people,
        {CustomDropdownColumn
            "First",
            list-items =
                {{Array-of ListValueItem}
                    {ListValueItem "", label = ""},
                    {ListValueItem "John", label = "ジョン"},
                    {ListValueItem "Jane", label = "ジェーン"},
                    {ListValueItem "Joe", label = "ジョー"}
                }
        }

    }
}
{value grid}

グリッド内のドロップダウンリストを表示する方法で、
もっとよい方法があれば教えてください。


RE: RecordGrid でDropdownList を表示 - kudoa - 02-15-2014

素人の質問でもうしけありません。

{def grid =
{RecordGrid
record-source = people,
{CustomDropdownColumn
"First",
list-items =
{{Array-of ListValueItem}
{ListValueItem "", label = ""},
{ListValueItem "John", label = "ジョン"},
{ListValueItem "Jane", label = "ジェーン"},
{ListValueItem "Joe", label = "ジョー"}
}
}
}
}

とRecordGridに対してCustomDropdownColumnをアサインされておられますが、VLEにて予めRecordGridが使用されていた際は、どの様にしてCustomDropdownColumnをアサインすれば宜しいでしょうか。
アドバイス頂ければ幸いです。



RE: RecordGrid でDropdownList を表示 - dyoshida - 02-16-2014

予め生成されているRecordGridに対して設定する場合は、RecordGrid.columnsに設定してはどうでしょうか?
Code:
{def grid =
    {RecordGrid
        record-source = people
    }
}
{do
    set grid.columns =
        {new {Array-of RecordGridColumn},
            {CustomDropdownColumn
                "First",
                list-items =
                    {{Array-of ListValueItem}
                        {ListValueItem "", label = ""},
                        {ListValueItem "John", label = "ジョン"},
                        {ListValueItem "Jane", label = "ジェーン"},
                        {ListValueItem "Joe", label = "ジョー"}
                    }
            },
            {RecordGridColumn "Last"},
            {RecordGridColumn "Age"}
        }
}



RE: RecordGrid でDropdownList を表示 - kudoa - 02-16-2014

dyoshida様、ご返信頂き有り難う御座いました、助かりました。

又、uememura様には、いつも有益な情報感謝いたします。


RE: RecordGrid でDropdownList を表示 - watanabe - 06-24-2015


CDBCでOracleデータベースから取得する場合
ソース:
{let connection:BasicConnection =
{BasicConnection {url "http://localhost:8080/cdbc-server/CdbcServlet"}}
}
{let rs:RecordSet = {connection.create-record-set "SAMPLE_USER", "employee"}}

【employee】テーブルのSEX列値は"0"と"1"です。
RecordGridで、SEX列を(0:Male, 1:Female)の2項目を含むドロップダウンリスト形で表示させたい場合、
どのようなコーディングを行えば良いでしょうか。

よろしくお願いいたします