ScrollIntoView не сработает после ShowDialog - PullRequest
0 голосов
/ 16 октября 2018

Код должен сработать, как только я закончу редактирование данных во вторичном окне.Все работает как надо, но ScrollIntoView не сработает.Он выбирает правильный Index, но затем отказывается перейти к нему.

Я полностью потерян в этой точке.Я подозреваю, что это связано с тем, что для загрузки DataTable в DataGrid (я играю со странными запросами) требуется около 500 мс , а код пытается переместитьсяSelectedIndex до того, как это станет возможным?

Примечание: "dg_part.SelectedIndex = -1;"должно быть там, или я не могу правильно запустить новое событие SelectionChanged.

Код:

    public void DG_Part_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (CurrentPartID != 0)
        {
            int lastId = CurrentPartID;
            EditWindow ew = new EditWindow(CurrentPartID)
            {
                Owner = this
            };
            ew.ShowDialog();
            if (Public_Strings.invokeDataGridParts == "yes")
            {
                InvokeDataGridPart();
                SqlPartsSetToRow(lastId);
                dg_part.ScrollIntoView(dg_part.Items[dg_part.SelectedIndex]);
                dg_part.SelectedIndex = -1;
            }
        }
    }

    public void InvokeDataGridPart()
    {
        SqlCommand cmd = new SqlCommand
        {
            CommandText = "SELECT * FROM cbu_deli WHERE [IDX] = '" + CurrentID + "' ORDER BY LEN ([DEL]), [DEL] ASC, [OPIS] DESC, [DELEZ] DESC",
            Connection = con
        };
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        dtPart.Clear();
        da.Fill(dtPart);
        dg_part.ItemsSource = dtPart.DefaultView;
        mycollection.GroupDescriptions.Clear();
        mycollection.GroupDescriptions.Add(new PropertyGroupDescription("DEL"));
        dg_part.ItemsSource = mycollection.View;
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
    }

    public int CurrentPartID
    {
        get
        {
            int tmp = 0;
            if (dg_part.SelectedIndex >= 0)
            {
                int.TryParse(dtPart.Rows[dg_part.SelectedIndex].ItemArray[0].ToString(), out tmp);
            }
            return tmp;
        }
    }


    public void SqlPartsSetToRow(int Id)
    {
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
        dg_part.SelectionChanged -= DG_Part_SelectionChanged;
        while (CurrentPartID != Id && dg_part.SelectedIndex < dtPart.Rows.Count - 1)
        {
            dg_part.SelectedIndex++;
        }
        dg_part.SelectionChanged += DG_Part_SelectionChanged;
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
    }

1 Ответ

0 голосов
/ 17 октября 2018

Я «решил» это, добавив задержку 0 мс.Не спрашивайте меня, почему это работает.Если у кого-то есть объяснение, я был бы признателен.

  1. public DispatcherTimer Delay;
    
    public void DispatcherTimer()
    {
        Delay = new DispatcherTimer();
        Delay.Tick += DelayTick;
        Delay.Interval = new TimeSpan(0);
    }
    
  2. public void DG_Part_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (CurrentPartID != 0)
        {
            int lastId = CurrentPartID;
            EditWindow ew = new EditWindow(CurrentPartID)
            {
                Owner = this
            };
            ew.ShowDialog();
            if (Public_Strings.invokeDataGridParts == "yes")
            {
                InvokeDataGridPart();
                SqlPartsSetToRow(lastId);
                Delay.Start();
            }
        }
    }
    
    public void DelayTick(object sender, EventArgs e)
    {
        Delay.Stop();
        dg_part.ScrollIntoView(dg_part.Items[dg_part.SelectedIndex]);
        dg_part.SelectedIndex = -1;
    }
    

РЕДАКТИРОВАТЬ: следующее решениерешил мою проблему и добавил центрирование:

(Обязательно измените ScrollIntoView на ScrollToCenterOfView)

Сделайте ListView.ScrollIntoView Выделите элемент в центр ListView (C #)

Пришлось изменить крошечную деталь:

        // Compute the center point of the container relative to the scrollInfo
        System.Windows.Size size = container.RenderSize;
        System.Windows.Point center = container.TransformToAncestor((Visual)scrollInfo).Transform(new System.Windows.Point(size.Width / 2, size.Height / 2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...