Как я могу обработать это исключение приведения в C #: system.data.model в system.windows.controls.Флажок?

#c# #checkbox #casting #system.data

#c# #флажок #Кастинг #system.data

Вопрос:

Это мой модельный класс анализа

 public partial class analys
    {
        public int id { get; set; }
        public string name { get; set; }
        public int price { get; set; }
        public bool Type_qualitatif { get; set; }
        public bool Type_quantitatif { get; set; }
        public System.DateTime create_at { get; set; }
        public System.DateTime update_at { get; set; }
        public int sectionId { get; set; }
    
        public virtual section section { get; set; }
    }
}
 

Я создаю список, в котором флажки отображаются в виде элементов, а содержимое каждого из них — это имя анализа.

Итак, я пытаюсь установить содержимое флажков и сохранить их в списке с приведенным ниже кодом

 foreach ( CheckBox item in  _biochimieExam.BiochimieExamsItemsControl.Items )
             {
                 if(item.IsChecked == true)
                 {
                   //  String exam = item.Content.ToString();
                     SelctedItems.Add(item.Content.ToString());
                 }
             } 
            
            foreach(String item in SelctedItems)
            {
                BchExamsList.Add(new analys
                {
                    name = item
                }) ;
            }

 

Но я получаю исключение приведения inavlid, при котором невозможно привести объект типа ‘System.Data.Entity.DynamicProxies.analys_F69488E20B133B223573E1D5931B83214F85574493596933EB8BFDBD5F513C59 «в системе типа «.Windows.Элементы управления.Флажок ‘.’ который я пытаюсь разрешить. Но мне не удалось.

Пожалуйста, мне нужна помощь. Спасибо.

Ответ №1:

в этой строке

 foreach ( CheckBox item in _biochimieExam.BiochimieExamsItemsControl.Items )
 

вы пытаетесь рассматривать каждый элемент в _biochimieExam.BiochimieExamsItemsControl.Items качестве флажка, но элементы в _biochimieExam.BiochimieExamsItemsControl.Items ar типа analys .

попробуйте это вместо:

 foreach (analys item in _biochimieExam.BiochimieExamsItemsControl.CheckedItems)
{
    BchExamsList.Add(new analys
    {
        name = item.name
    });
}
 

Комментарии:

1. Проблема в том, что в списке нет метода для отслеживания установленных флажков. Таким образом, возникает ошибка с кодом _biochimieExam. BiochimieExamsItemsControl. Проверенные элементы

2. Есть ли какой-нибудь ItemsControl, который может отслеживать отмеченные флажки как элементы?

3. Я забыл упомянуть в своем ответе, что на самом деле вы должны использовать CheckedListBox , еще один стандартный элемент управления, который имеет те же функции, что и ListBox, плюс флажки.

Ответ №2:

Я, наконец, решил проблему, используя контрольный список пакета Xceed toolkit.

Моей целью было получить значение установленных флажков. Сначала я использовал список с флажками в качестве элементов. И именно поэтому я пишу этот код

 foreach ( CheckBox item in  _biochimieExam.BiochimieExamsItemsControl.Items )
             {
                 if(item.IsChecked == true)
                 {
                   //  String exam = item.Content.ToString();
                     SelctedItems.Add(item.Content.ToString());
                 }
             } 
            
            foreach(String item in SelctedItems)
            {
                BchExamsList.Add(new analys
                {
                    name = item
                }) ;
            }

 

Чтобы решить мою проблему, я вношу эти изменения в свой код :

Xaml

 
 <XceedToolkit:CheckListBox Margin="5,5" x:Name="BiochimieExamsItemsControlXceed" 
                                   ValueMemberPath="name"  DisplayMemberPath="name" FontWeight="Bold"
                                   SelectedMemberPath="name" SelectedValue="{Binding SelectedValue}"  
                                   SelectedItemsOverride="{Binding SelectedItems}"
                                   Style="{DynamicResource ListAnalysesItemsControlXceed}" ItemSelectionChanged="BiochimieExamsItemsControlXceed_ItemSelectionChanged" >

            <XceedToolkit:CheckListBox.Resources>
                <Style TargetType="CheckBox">
                    <Style.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Background" Value="white"></Setter>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Gray"></Setter>
                        </Trigger>
                        <Trigger Property="IsKeyboardFocusWithin" Value="True">
                            <Setter Property="Background" Value="white"></Setter>
                        </Trigger>
                    </Style.Triggers>
                    <Setter Property="Background" Value="White" />
                    <Setter Property="MinHeight" Value="16"/>
                    <Setter Property="VerticalContentAlignment" Value="Center"/>
                    <Setter Property="Margin" Value="8,2"/>
                    
                    
                 
              
                </Style>
            </XceedToolkit:CheckListBox.Resources>
            
        </XceedToolkit:CheckListBox>

 

И в коде, лежащем в основе :

 public ObservableCollection<Object> BchSelectedExams { get; set; }


        public void BiochimieExamsItemsControlXceed_ItemSelectionChanged(object sender, Xceed.Wpf.Toolkit.Primitives.ItemSelectionChangedEventArgs e)
        {
           
            BchSelectedExams = (ObservableCollection<object>)BiochimieExamsItemsControlXceed.SelectedItems;
           

            foreach (analys o in BiochimieExamsItemsControlXceed.SelectedItems)
            {
                Console.WriteLine(o.name);
              
            }


        }