Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Shievone

    újonc

    Sziasztok,

    A következő problémával találtam szembe magam:

    Adott egy winform és rajta két darab TabControl komponens. Az egyik TabControl-on pedig van néhány TabPage. Két dolgot szeretnék megoldani:

    1) A TagPage-ek sorba rendezhetők legyenek adott TabControl-on belül. (drag&drop technika)

    2) A TabPage áthelyezhető legyen egyik TabControl-ból a másikba és akár vissza. (drag&drop technika)

    Az 1) már készen van. Erre létrehoztam egy saját komponenst az alábbi kóddal, viszont a 2) ponthoz még a neten sem találtam használható infó:

    public partial class customTabControl : TabControl
    {
    public customTabControl()
    {
    InitializeComponent();
    this.AllowDrop = true;
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
    int hoverTabPageIndex = this.getHoverTabIndex();
    if (hoverTabPageIndex >= 0)
    {
    this.Tag = this.TabPages[hoverTabPageIndex];
    }
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
    this.Tag = null;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
    if (e.Button != MouseButtons.Left || this.Tag == null) return;

    TabPage draggedTabPage = (TabPage)this.Tag;
    this.DoDragDrop(draggedTabPage, DragDropEffects.All);
    }

    protected override void OnDragOver(DragEventArgs e)
    {
    if (e.Data.GetData(typeof(TabPage)) == null) return;

    TabPage draggedTabPage = (TabPage)e.Data.GetData(typeof(TabPage));
    int draggedTabPageIndex = this.TabPages.IndexOf(draggedTabPage);

    int hoverTabPageIndex = this.getHoverTabIndex();
    if (hoverTabPageIndex < 0) { e.Effect = DragDropEffects.None; return; }
    TabPage hoverTabPage = this.TabPages[hoverTabPageIndex];

    e.Effect = DragDropEffects.Move;

    if (draggedTabPage == hoverTabPage) return;

    Rectangle dragTabPageRect = this.GetTabRect(draggedTabPageIndex);
    Rectangle hoverTabPageRect = this.GetTabRect(hoverTabPageIndex);
    if (dragTabPageRect.Width < hoverTabPageRect.Width)
    {
    Point tcLocation = this.PointToScreen(this.Location);
    if (draggedTabPageIndex < hoverTabPageIndex)
    {
    if ((e.X - tcLocation.X) > ((hoverTabPageRect.X + hoverTabPageRect.Width) - dragTabPageRect.Width))
    this.swapTabPages( draggedTabPage, hoverTabPage);
    }
    else if (draggedTabPageIndex > hoverTabPageIndex)
    {
    if ((e.X - tcLocation.X) < (hoverTabPageRect.X + dragTabPageRect.Width))
    this.swapTabPages(draggedTabPage, hoverTabPage);
    }
    }
    else
    {
    this.swapTabPages(draggedTabPage, hoverTabPage);
    }

    this.SelectedTab = draggedTabPage;
    }

    private int getHoverTabIndex()
    {
    for (int i = 0; i < this.TabPages.Count; i++)
    {
    if (this.GetTabRect(i).Contains(this.PointToClient(Cursor.Position)))
    return i;
    }

    return -1;
    }

    private void swapTabPages(TabPage draggedTabPage, TabPage hoverTabPage)
    {
    int draggedTabPageIndex = this.TabPages.IndexOf(draggedTabPage);
    int hoverTabPageIndex = this.TabPages.IndexOf(hoverTabPage);

    this.TabPages[hoverTabPageIndex] = draggedTabPage;
    this.TabPages[draggedTabPageIndex] = hoverTabPage;
    this.Refresh();
    }

    Valakinek ötlete esetleg?

    Előre is köszönök minden építő jellegű hozzászólást.

Új hozzászólás Aktív témák