سؤال

I'm using VB2008 Express. And I've been working on a "popup" to select a date range. The DateTimePicker isn't ideal because the purpose is to pick a date range, which will always be one full week, from Sunday through Saturday. The control works just fine and I'm pretty proud of it. My problem has to do with the border added when using ToolstripControlHost for this. I've included a screenshot and my code.

enter image description here

In the code below, assume there exists a button named "btnTimePeriod", below which I desire to show a panel, which contains a few custom items, and the panel's name is "pnlDateRangePicker".

IT WORKS... but it doesn't look right. The panel itself is 147 x 326 pixels, but notice in the attached graphic that it's adding a border around the panel which I don't want. There's a border on the top, bottom, and left... but for some reason the border on the right one is especially large. Although my code doesn't expressly set it, AutoSize = true so I would have expected it to shrink around the panel.

As required, my code already does set ShowCheckMargin and ShowImageMargin false. I haven't included the code for the DrawDateCalander Sub because it's not relevant. I believe even a blank panel would yield the same result. I have no idea where this margin is coming from. Any guidance?

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
هل كانت مفيدة؟

المحلول

I've never used a ContextMenuStrip for that, and maybe that's the problem.

You can try using a ToolStripDropDown instead:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top