Невозможно преобразовать объект типа `CustomObject` в исключение System.Data.DataRowView. - PullRequest
0 голосов
/ 02 февраля 2020

Я недавно столкнулся, и ошибка выглядела так:

"невозможно привести объект типа pPP_2.Module к типу System.Data.DataRowView".

У меня есть Datagrid внутри моего кода, который имеет столбец кнопки. Выглядит так:

enter image description here

Код Xaml позади:

<DataGrid x:Name="ModuleGrid" Grid.ColumnSpan="6" Grid.Column="1" Grid.RowSpan="4" 
                  Grid.Row="1" AutoGenerateColumns="False" CanUserAddRows="False" Margin="10,10,10,13" GridLinesVisibility="None" AlternatingRowBackground="DarkGray">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Module Name" Binding="{Binding Path=Name}"></DataGridTextColumn>
                <DataGridTemplateColumn Header="Features">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListView ItemsSource="{Binding Features}" SelectedItem="{Binding Feature}" >
                                <ListView.DisplayMemberPath>
                                    Name
                                </ListView.DisplayMemberPath>
                            </ListView>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Min:Values">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListView ItemsSource="{Binding Features}" SelectedItem="{Binding Feature}" >
                                <ListView.DisplayMemberPath>
                                    MinValue
                                </ListView.DisplayMemberPath>
                            </ListView>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Max:Values">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListView ItemsSource="{Binding Features}" SelectedItem="{Binding Feature}" >
                                <ListView.DisplayMemberPath>
                                    MaxValue
                                </ListView.DisplayMemberPath>
                            </ListView>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Change Per Minute Per Liter">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListView ItemsSource="{Binding Features}" SelectedItem="{Binding Feature}" >
                                <ListView.DisplayMemberPath>
                                    ChangePerMinutePerLiter
                                </ListView.DisplayMemberPath>
                            </ListView>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Click="ButtonBase_OnClick" Background="LightSkyBlue" Margin="5">Pass</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

Каждая строка заполнена пользовательским объектом типа Module, Код позади:

public class Module
    {
        public string Name { get; set; }
        public string UniqueName { get; set; }
        public Dictionary<Property, double> Properties { get; set; }
        public List<Feature> Features { get; set; }

        private Dictionary<Material, double> content = new Dictionary<Material, double>();
        public Dictionary<Material, double> Content
        {
            get
            {
                return content;
            }
            set
            {
                content = value;
            }
        }
        public double FillingCapacity { get; set; }
        public double FillingAmount
        {
            get
            {
                double ret = 0;
                foreach (double a in Content.Values)
                {
                    ret += a;
                }
                return ret;
            }
        }

        public override string ToString()
        {
            return Name;
        }
    }
public class Feature
    {
        public string Name { get; set; }
        public string FeatureType { get; set; }
        public Property UsedProperty { get; set; }
        public double MinValue { get; set; }
        public double MaxValue { get; set; }
        public double ChangePerMinutePerLiter { get; set; }
    }

)

А теперь код для события нажатия кнопки: (конечно, свойства объявлены в начале класса, но я покажу их здесь чтобы убедиться, что соединение ясно)

public String ChosenModule { get; set; }

public List<String> ChosenMods { get; set; }

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            try
            {
                ---DataRowView dataRowView = (DataRowView)((Button)e.Source).DataContext;---
                ChosenModule = dataRowView[0].ToString();
                ChosenMods.Add(ChosenModule);
                //This is the code which will show the button click row data. Thank you.
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

Итак, теперь моя проблема: метод ButtonBase_OnClick должен передать модуль выбранной строки в список строк ChosenMods (я получаю имя модуля который объявлен String с datarowview [0]). Когда я нажимаю кнопку, я получаю исключение:

Unable to cast object of type "pPP_2.Module" to type "System.Data.DataRowView" в строке, которую я пометил ---.

Я уже столько искал, но не смог найти решение для моей проблемы .. Благодаря рассмотрению моей проблемы,

Приветствие, IRezzet.

1 Ответ

0 голосов
/ 02 февраля 2020

Ооо, я не думаю, что кому-то все равно, но вот мое решение моей собственной проблемы:

Часть Xaml остается прежней. Код:

private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            Module module = (Module) ((Button) e.Source).DataContext;

            if (ChosenMods.Contains(module))
            {
                try
                {
                    MessageBox.Show("The Module `" + module.Name + "` is already chosen!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
            else
            {
                try
                {
                    ChosenMods.Add(module);
                    MessageBox.Show("The Module `" + module.Name + "` has been added!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
        }

Я в основном получаю Datacontext of the Button с Module module = (Module) ((Button) e.Source).DataContext;

I позже, чтобы поместить его в список модулей, который я использую позже.

Первой проблемой была инициализация моего Списка, которая выглядела так:

public List<Module> ChosenMods { get; set; }

, но должна была выглядеть так:

public List<Module> ChosenMods = new List<Module>();

public List<Module> ChosenMods1
        {
            get => ChosenMods;
            set => ChosenMods = value;
        }

Вторая проблема заключалась в том, что я использовал DataRowView, который, как я понял, там был абсолютно бессмысленным.

Спасибо за ваши ответы в любом случае, желаю вам хорошей недели.

Привет, IRezzet

...