locked
ListView выделение или "Unвыделение" что происходит RRS feed

  • Вопрос

  • Что происходит с ListView когда я например делаю SelectedItem левой кнопкой а потом на этом же Item нажимаю правой кнопкой. Прога падает (правда не на всех ListView) даже через try. Причём падает не из студии запущенная а уже через тайл. И предлагает запустить VS для дезассемблирования

    Спасибо

    18 декабря 2012 г. 14:57

Ответы

  • Собственно, как я и ожидал. Вот ответ на вашу проблему:

    Теперь, как я проверил, в чем проблема.

    Я создал новый проект, вот с такой разметкой:

    <ListView SelectionChanged="ListView_SelectionChanged_1">
        <ListViewItem>1</ListViewItem>
        <ListViewItem>2</ListViewItem>
        <ListViewItem>3</ListViewItem>
        <ListViewItem>4</ListViewItem>
    </ListView>

    Ну и написал вот такой код:

    private void ListView_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        object o = ((ListView)sender).SelectedItem;
    }

    Как видите, он ничего не делает. Но я поставил точку останова, запустил приложение, кликнул на элементе левой кнопкой мыши, а потом правой. При первом останове, в переменной o был ListViewItem. При втором:

    Соответственно, у вас вот в этой строке происходит попытка преобразовать к типу Tupe выбранного элемента, который является null-ом:

    int id = ((Tuple<int, string>)ListViewLisTenders.SelectedItem).Item1;

    Вообще, все что хоть теоретически может быть null, нужно на этот null проверять. Например, так:

    private async void ListViewLisTenders_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        if (ListViewLisTenders.SelectedItem != null)
        {
            try
            {
                ProgressBar1.Visibility = Visibility.Visible;
                int id = ((Tuple<int, string>)ListViewLisTenders.SelectedItem).Item1;
                ...
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

    • Помечено в качестве ответа developers_s 19 декабря 2012 г. 8:53
    19 декабря 2012 г. 6:15
    Отвечающий

Все ответы

  • Надо смотреть, что вы там накодировали. Контекстного меню, случаем нет никакого?
    18 декабря 2012 г. 15:21
    Отвечающий
  • Нет, контекстного меню нет, но по левой кнопке - да есть метод Selected_Changed - асинхронная выборка данных из базы (выборка по ID через Tuple).

            private async void ListViewLisTenders_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
            {
                try
                {
                    ProgressBar1.Visibility = Visibility.Visible;
                    int id = ((Tuple<int, string>)ListViewLisTenders.SelectedItem).Item1;
    
                    var dsf = new List<string>();
                    dsf = await this.Readtenders(id);
     
                    #region MyRegion
                    TextBoxNameTenders.Text = dsf[0].ToString();
                    TextBoxNameObject.Text = dsf[1].ToString();
                    TextBoxNameZakazchik.Text = dsf[2].ToString();
                    TextBoxStadii.Text = dsf[3].ToString();
                    TextBoxSummazakaz.Text = dsf[4].ToString();
                    TextBoxSummaAvansa.Text = dsf[5].ToString();
                    #endregion
    
                    ProgressBar1.Value = 100;
                    ProgressBar1.Visibility = Visibility.Collapsed;
                }
                catch (Exception)
                {
                    
                    throw;
                }
            }

    С правой кнопкой ничего не завязано.


    Спасибо

    Забыл важный факт написать. В Win8 по правой же кнопке вызываются верхнее и нижнее меню. Дак вот по нажатию на ListView правой кнопкой по выбранному Item верхнее меню как бы начинает выползать примерно на 5 пикселов и всё вылетает прога.

    Я только что убрал в catch вывод всяких exeption ничего падать не стало но полоска которая вылазит на 5 пикселов она не исчезает. Т.е. я выбираю Item левой кнопкой, потом на нём же правой вылазит полоска и всё. Прога дальше работает но полоска не исчезает. Но потом конечно она пропадает, если я выйду - зайду обратно.


    • Изменено developers_s 19 декабря 2012 г. 3:14
    19 декабря 2012 г. 3:02
  • Собственно, как я и ожидал. Вот ответ на вашу проблему:

    Теперь, как я проверил, в чем проблема.

    Я создал новый проект, вот с такой разметкой:

    <ListView SelectionChanged="ListView_SelectionChanged_1">
        <ListViewItem>1</ListViewItem>
        <ListViewItem>2</ListViewItem>
        <ListViewItem>3</ListViewItem>
        <ListViewItem>4</ListViewItem>
    </ListView>

    Ну и написал вот такой код:

    private void ListView_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        object o = ((ListView)sender).SelectedItem;
    }

    Как видите, он ничего не делает. Но я поставил точку останова, запустил приложение, кликнул на элементе левой кнопкой мыши, а потом правой. При первом останове, в переменной o был ListViewItem. При втором:

    Соответственно, у вас вот в этой строке происходит попытка преобразовать к типу Tupe выбранного элемента, который является null-ом:

    int id = ((Tuple<int, string>)ListViewLisTenders.SelectedItem).Item1;

    Вообще, все что хоть теоретически может быть null, нужно на этот null проверять. Например, так:

    private async void ListViewLisTenders_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        if (ListViewLisTenders.SelectedItem != null)
        {
            try
            {
                ProgressBar1.Visibility = Visibility.Visible;
                int id = ((Tuple<int, string>)ListViewLisTenders.SelectedItem).Item1;
                ...
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

    • Помечено в качестве ответа developers_s 19 декабря 2012 г. 8:53
    19 декабря 2012 г. 6:15
    Отвечающий
  •  Урааааа. Вообще Алексей, супер. Я теперь стал делать проверку на Null и в других местах. И просто сказка. Раньше не обращал внимание. Просто делал try И всё. В запуске из VS вылетала, но при запуске с тайла ничего не происходило. Ну меня вроде устраивало. Только в последнем случае чего то стала вылетать. А теперь простой проверкой снялось столько вопросов. Супер. Спасибо большое. :D Я счастлив. :)


    Спасибо

    19 декабря 2012 г. 8:58