2011-11-11 3 views
3

私はVB2008 Expressを使用しています。私は、日付範囲を選択するための "ポップアップ"に取り組んできました。 DateTimePickerは理想的ではありません。なぜなら、目的は日曜日から土曜日まで、常に1週間になる日付範囲を選択するためです。コントロールはうまく動作し、私はそれをかなり誇りに思っています。私の問題は、このためにToolstripControlHostを使用するときに追加された境界線と関係しています。私はスクリーンショットと私のコードを含んでいます。以下のコードでポップアップコントロールのToolstripControlHostを使用した場合のパディング/サイズ/マージン

enter image description here

、そこに想定し、いくつかのカスタム項目が含まれています、私はパネルを表示することを望むその下に「btnTimePeriod」という名前のボタンを、存在しており、パネルの名前は「pnlDateRangePicker」です。

IT制作...しかし、それは正しく見えません。パネル自体は147 x 326ピクセルですが、付属のグラフィックには、パネルの周りに境界線が追加されていることがわかります。上、下、左に境界線がありますが、何らかの理由で右端の境界線が特に大きくなります。私のコードでは明示的に設定されていませんが、AutoSize = trueのため、パネルの周りを縮小すると予想していました。

私のコードでは、すでにShowCheckMarginとShowImageMarginをfalseに設定しています。 DrawDateCalander Subのコードは、関連していないので、私は含まれていません。空のパネルでも同じ結果が得られると私は信じている。私はこのマージンがどこから来ているのか分かりません。どんな指導?

Private Sub btnTimePeriod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTimePeriod.Click 
    Call DrawDateCalendar(DatePart(DateInterval.Month, FirstDisplayedSunday), DatePart(DateInterval.Year, FirstDisplayedSunday)) 
    Call ShowControlBelow(btnTimePeriod, pnlDateRangePicker) 
End Sub 

Sub ShowControlBelow(ByVal Showbutton As Control, ByVal ShownControl As Control) 

    Dim PopupContainer As New ToolStripControlHost(ShownControl) 
    PopupContainer.Margin = New Padding(0) 
    Dim mnuDropDown As New ContextMenuStrip 
    mnuDropDown.Padding = New Padding(0) 
    mnuDropDown.ShowCheckMargin = False 
    mnuDropDown.ShowImageMargin = False 
    mnuDropDown.Items.Add(PopupContainer) 
    ShowMenuBelow(Showbutton, mnuDropDown) 

End Sub 

Sub ShowMenuBelow(ByVal Showbutton As Control, ByVal WhichMenu As ContextMenuStrip, Optional ByVal AlignRight As Boolean = False) 
    Dim x As Integer = 0 
    Dim y As Integer = 0 
    Dim itscontainer As Control = Showbutton.Parent 
    x = Showbutton.Location.X 
    y = Showbutton.Location.Y 
    If Not itscontainer Is Nothing Then 
     Do Until TypeOf itscontainer Is Form 
      x = x + itscontainer.Location.X 
      y = y + itscontainer.Location.Y 
      itscontainer = itscontainer.Parent 
      If itscontainer Is Nothing Then Exit Do 
     Loop 
    End If 
    y = y + Showbutton.Height 
    If AlignRight = True Then 
     x = x - WhichMenu.Width + Showbutton.Width 
    End If 
    Dim xy As New Point(x, y) 
    WhichMenu.Show(Showbutton.FindForm, xy) 


End Sub 

答えて

3

私はそのためContextMenuStripを使ったことがない、そしておそらくそれが問題です。

代わりToolStripDropDownを使用して試すことができます:

Private Sub ShowControl(ByVal fromControl As Control, ByVal whichControl As Control) 
    '\\ whichControl needs MinimumSize set: 
    whichControl.MinimumSize = whichControl.Size 

    Dim toolDrop As New ToolStripDropDown() 
    Dim toolHost As New ToolStripControlHost(whichControl) 
    toolHost.Margin = New Padding(0) 
    toolDrop.Padding = New Padding(0) 
    toolDrop.Items.Add(toolHost) 
    toolDrop.Show(Me, New Point(fromControl.Left, fromControl.Bottom)) 
End Sub 

Private Sub btnTimePeriod_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTimePeriod.Click 
    Call DrawDateCalendar(DatePart(DateInterval.Month, FirstDisplayedSunday), DatePart(DateInterval.Year, FirstDisplayedSunday)) 
    '\\Call ShowControlBelow(btnTimePeriod, pnlDateRangePicker) 
    Call ShowControl(btnTimePeriod, pnlDateRangePicker) 
End Sub 
+0

はあなたに感謝! LarsTechの答えは正しいものでした。しかし、2つの警告: 1)私はmnuDropDown.Maximumsizeを明示的にmnuDropDownのサイズにしなければならなかった。 ShownControlよりも幅と高さが3ピクセル少なくなっています。私はそれがパディングやマージンの設定であると仮定しましたが、どちらのプロパティも関連するコントロールに設定されていても効果がありませんでした。 2)ShowMenuBelowプロシージャの目的は、ボタンがネストされたコンテナの複数のレイヤー内にある場合に、フォームに関連した適切なX/Y位置を見つけることです。 – PaulOTron2000

関連する問題