レコードグリッドの行番号を表示するには? - umemura - 08-20-2013
レコードグリッドに行番号を表示したいです。
よい実装方法はありますでしょうか。
RE: レコードグリッドの行番号 - umemura - 08-20-2013
RecordGrid.row-background-spec を利用する方法があると思いますが、
そもそも行番号のためのプロパティではないですし、
並び替えのたびに、すべてのレコードが編集されてしまうのがうれしくありません。
中のレコードとは関係なく行番号を表示することはできないのでしょうか。
Code: {define-proc public {notified rg:RecordGrid, r:Record, i:int}:#Background
set r["id"] = {String i + 1}
{return null}
}
{let people:RecordSet =
{RecordSet
{RecordFields
{RecordField "id", domain = String},
{RecordField "First", domain = String},
{RecordField "Last", domain = String},
{RecordField "Age", domain = int}
},
{RecordData id = "1", First = "John", Last = "Smith", Age = 25},
{RecordData id = "1", First = "Jane", Last = "Smith", Age = 29},
{RecordData id = "1", First = "Jane", Last = "Jones", Age = 28}
}
}
{def rg =
{RecordGrid
row-background-spec = notified,
record-source = people,
height = 5cm,
width = 8in,
vertical-grid-line-width = 4px
}
}
{value
{VBox
rg,
{HBox
{CommandButton
width = {make-elastic}, label = "append record",
{on Action do
{people.append {RecordData}}
}
},
{CommandButton
width = {make-elastic}, label = "delete current record",
{on Action do
{if-non-null r = rg.current-record then
{r.delete}
}
}
},
{CommandButton
width = {make-elastic}, label = "commit records",
bound-command = {rg.get-command "commit"}
},
{CommandButton
width = {make-elastic}, label = "revert records",
bound-command = {rg.get-command "revert"}
}
}
}
}
RE: レコードグリッドの行番号 - Yuhki - 08-21-2013
RecordGridColumnのformat-specを利用してはどうでしょうか?
Code: {RecordGridColumn
"id",
format-spec =
{proc {data:any, r:Record}:String
{return {String {rg.records.get-index r} + 1}}
}
}
ただ、処理の負荷を考えるとRecordGridCellを継承したクラスを作って
formatメソッドにてRecordGridCell.record-indexを返すようにするほうが
いいかもしれませんね。
RE: レコードグリッドの行番号を表示するには? - umemura - 08-21-2013
RecordGridCell.record-index ですか!
format-spec を使うと、対象のRecordSetに存在する RecordField.field-name を指定しないと表示できない?のですかね?
対象のレコードに依存せずに、カラム単体で行番号を表示できるようにしたいです。
とりあえず、 refresh-data を利用してみました。
Code: {define-class public LineNumberCell {inherits RecordGridCell }
field line-number-frame:Frame = {Frame halign = "right", margin = 1pt}
{constructor public {default ...}
{construct-super {splice ...}}
{self.add-internal self.line-number-frame}
}
{method public {refresh-data }:void
{self.line-number-frame.add replace? = true, self.record-index + 1}
}
}
{define-class public LineNumberColumnl {inherits RecordGridColumn}
{constructor public {default
width:any = 20pt,
header-spec:any = "No.",
...}
{construct-super
"",
header-spec = header-spec,
width = width,
{splice ...}}
set self.cell-spec = LineNumberCell
set self.editable? = false
}
}
{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 rg =
{RecordGrid
{LineNumberColumnl},
record-source = people,
height = 5cm,
width = 8in,
vertical-grid-line-width = 4px
}
}
{value rg}
RE: レコードグリッドの行番号を表示するには? - dyoshida - 08-21-2013
umemuraさんのコードを試させていただきましたが、なかなかよい感じですね。
個人的には行選択した場合に行番号セルも選択色になって欲しい気がするので、
RecordGridCell のかわりに StandardStringCell を継承するのはどうでしょうか?
Code: {define-class public LineNumberCell {inherits StandardStringCell}
field line-number-frame:Frame = {Frame halign = "right", margin = 1pt}
{constructor public {default ...}
{construct-super {splice ...}}
set self.cells-take-focus? = false
}
{method public {refresh-data }:void
{super.refresh-data}
set self.display-graphic.contents = {String (self.record-index + 1)}
}
}
|