2010/12/17

access2010 Ribbon comboBoxの不具合

invalidateControlで再キャッシュ後getTextで取得した値を中の人が忘れてしまう。

フォームを閉じるとき、invalidatecontrolを実行。開く時では、リボンがキャッシュされていないことがあるからと普通に考えた。要はフォームを開いたときは初期化しておきたかっただけ。
で、どうなるかというと、
comboBoxのItemを選択もしくは同じ文字列を投入し、フォームを閉じる。この時、comboBoxの値の初期化が成功するのは目視できる。だけど、フォームを再び開いたときには最後に投入したItemが選択された状態に戻っている。
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" 
               onLoad="onLoad">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="tab01" label="タブ01">
        <group id="g01" label="グループ01">
          <comboBox id="cb01" label="コンボボックス" getText="getText">
            <item id="i01" label="item01" imageMso="Info" />
            <item id="i02" label="item02" imageMso="HappyFace" />
            <item id="i03" label="item03" imageMso="PanningHand" />
          </comboBox>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
Option Compare Database
Option Explicit

Private rbn As IRibbonUI

Sub onLoad(ribbon As IRibbonUI)
    Set rbn = ribbon
End Sub

Sub getText(ctr As IRibbonControl, rtn)
    rtn = "(未選択)"
End Sub

Sub Invalidate_cb01()
    rbn.InvalidateControl "cb01"
End Sub
Option Compare Database
Option Explicit

Private Sub Form_Close()
    Module1.Invalidate_cb01
End Sub

で、現時点での対策その1。但し、該当comboBoxが配置されているタブがアクティブになること
Option Compare Database
Option Explicit

Private rbn As IRibbonUI

Sub onLoad(ribbon As IRibbonUI)
    Set rbn = ribbon
End Sub

Sub getText(ctr As IRibbonControl, rtn)
    rtn = "(未選択)"
    DoEvents
End Sub

Sub Invalidate_cb01()
    rbn.InvalidateControl "cb01"
End Sub
Option Compare Database
Option Explicit

Private Sub Form_Load()
On Error Resume Next '初回のエラーだけ処理したい
    Module1.Invalidate_cb01
End Sub

対策その2。初期化なんて考えない。

0 件のコメント: