11-09-2015, 12:52 PM
グリッドにおいて次のような背景色制御を行おうとしています。
1. データの変更有無、行の遇奇等による表示制御を行う
2. 現在選択している行は 1. に従わず、常に背景色を青にする
3. ただし、現在選択している行の内、現在選択しているセルの背景色は青にはせず 1. に従って制御を行う。
カスタム セル クラスの refresh-data で self.edit-active? を見て背景色を制御することで
概ね実現できたのですが、3. の仕様について、
フォーカスを得た後値を入力せずにフォーカス遷移した場合に正しく動作しませんでした。
・マウスで同じ行の別のセルを選択:1つ前に選択されていたセルの背景色が青に戻らない
・Tabでフォーカス移動:それまで選択されていたセルの背景色が青に戻らない
※ 値を入力してからフォーカスを移動した場合は正しく制御されます。
どのように修正したらよいでしょうか?
|| カスタム セル クラス
{define-class public AmountCell {inherits StandardStringCell}
...
{method public {refresh-data}:void
|| バッチイベント中は再描画しない
{if-non-null self.grid, self.grid.record-source then
{if self.grid.record-source.batch-events? then
{return}
}
}
|| 基底の処理
{super.refresh-data}
|| 再描画処理
{self.get-screen-for-grid}
{if self.screen == null then
{return}
}
{self.control-focus-acceptablity}
{self.control-bg-color} || このメソッドが背景色制御
{self.control-font}
}
...
||############################################################
|| 背景色制御
||############################################################
{method protected {control-bg-color}:void
{if not {self.ready-to-control?} then
{return}
}
let r:Record = self.grid.records[{self.screen.first-index-of-group self.record-index, {non-null self.record}}]
|| 選択行のルールは他の全てに優先する
{if {self.do-selected-background-control {non-null self.record}} == true then
{return}
}
set self.background = {Background.from-Color {self.do-base-background-control r}}
}
...
||############################################################
|| 選択行の背景色制御 (他のすべての制御に優先する)
||############################################################
{method protected {do-selected-background-control r:Record}:bool
|| self.record や self.screen の null チェックはこの中で行っている
{if not {self.ready-to-control?} then
{return false}
}
|| 現在選択されている行と同一グループの行は全て選択表示
{if self.group-selected? then
|| 選択されているセルは選択反転しない
{if self.edit-active? then
{return false}
}
set self.background = self.selected-background
{return true}
else
|| レコードグリッドの現在レコードが取得できなければ非選択として表示する
{return false}
}
}
...
}
1. データの変更有無、行の遇奇等による表示制御を行う
2. 現在選択している行は 1. に従わず、常に背景色を青にする
3. ただし、現在選択している行の内、現在選択しているセルの背景色は青にはせず 1. に従って制御を行う。
カスタム セル クラスの refresh-data で self.edit-active? を見て背景色を制御することで
概ね実現できたのですが、3. の仕様について、
フォーカスを得た後値を入力せずにフォーカス遷移した場合に正しく動作しませんでした。
・マウスで同じ行の別のセルを選択:1つ前に選択されていたセルの背景色が青に戻らない
・Tabでフォーカス移動:それまで選択されていたセルの背景色が青に戻らない
※ 値を入力してからフォーカスを移動した場合は正しく制御されます。
どのように修正したらよいでしょうか?
|| カスタム セル クラス
{define-class public AmountCell {inherits StandardStringCell}
...
{method public {refresh-data}:void
|| バッチイベント中は再描画しない
{if-non-null self.grid, self.grid.record-source then
{if self.grid.record-source.batch-events? then
{return}
}
}
|| 基底の処理
{super.refresh-data}
|| 再描画処理
{self.get-screen-for-grid}
{if self.screen == null then
{return}
}
{self.control-focus-acceptablity}
{self.control-bg-color} || このメソッドが背景色制御
{self.control-font}
}
...
||############################################################
|| 背景色制御
||############################################################
{method protected {control-bg-color}:void
{if not {self.ready-to-control?} then
{return}
}
let r:Record = self.grid.records[{self.screen.first-index-of-group self.record-index, {non-null self.record}}]
|| 選択行のルールは他の全てに優先する
{if {self.do-selected-background-control {non-null self.record}} == true then
{return}
}
set self.background = {Background.from-Color {self.do-base-background-control r}}
}
...
||############################################################
|| 選択行の背景色制御 (他のすべての制御に優先する)
||############################################################
{method protected {do-selected-background-control r:Record}:bool
|| self.record や self.screen の null チェックはこの中で行っている
{if not {self.ready-to-control?} then
{return false}
}
|| 現在選択されている行と同一グループの行は全て選択表示
{if self.group-selected? then
|| 選択されているセルは選択反転しない
{if self.edit-active? then
{return false}
}
set self.background = self.selected-background
{return true}
else
|| レコードグリッドの現在レコードが取得できなければ非選択として表示する
{return false}
}
}
...
}