2012-03-06 25 views
0

MS Accessフォームでツリービューコントロールを使用しています。サブフォームコンボボックスコントロールの値のリストは、メインフォームのツリービューで選択されたノードによって異なります。 私は次のようにサブフォーム上のリストの内容をドロップダウンコンボボックスのリフレッシュを達成しようとしています:サブフォームコンボボックスのrowsourceの更新方法 - ドロップダウンリストの更新方法

Public Sub TreeView1_nodeClick(ByVal node As Object) 
    subForm.Controls("Bid").RowSource = "... newquery depending on tree node values ..." 
    subForm.Controls("Bid").Requery 
End Sub 

しかし、奇妙なことに、これは、値のリストを更新しません。 同じノードを2回目にクリックすると、リストが期待値に更新されます。別のノードがクリックされると、リストは間違っています(割り当てられた最後のものに関係なく、最後に割り当てられた行ソースに関連するリストを含みます)。

コンボボックスの「rowsource」を有効にするのに時間がかかりますか?
この不快な問題の解決策は何ですか?

答えて

0

OKこれは自分のための解決策を見つけました - 特に気に入っていませんが(*)、それはうまくいきますので、誰かが王道を使って解決策を提供するまで、一時回避策と見なしますどういうわけかこれに所望の効果を持たせる)。

私はmsdnサイトを確認し、コンボボックスリストの人口に自己定義関数を使用することも可能であることを発見しました。この単純な部分は、Accessがその関数を使用しなければならないという事実の仕様です:行の関数名をコンボボックスのSource Typeプロパティに入力します。その背後にある。
ここではあまり簡単な部分はない - MSは、関数と特定のコンテンツのための特定の形式が必要です。次のように鉱山になります

Private Function customFuncName(fld As Control, id As Variant, row As Variant, col As Variant, code As Variant) As Variant 
    Dim rs As Recordset 
    Set rs = CurrentDb.OpenRecordset(... new query ...) 

    Select Case code 
     Case acLBInitialize 
      customFuncName = True 
     Case acLBOpen 
      customFuncName = 1 
     Case acLBGetRowCount 
      customFuncName = rs.RecordCount 
     Case acLBGetColumnWidth 
      customFuncName = -1 
     Case acLBGetValue    
      customFuncName = rs.GetRows(rs.RecordCount)(col, row) 
    End Select 

End Function 

msdn.microsoft.com rowSourceType propertyとそれにリンクspecific function code argumentsを参照してください。

(*)明らかなレコードセットのオーバーヘッドによりパフォーマンスが低下するためですが、表示されるリストは最大40行ですので、問題なく動作します。

関連する問題