c# - 选择组合框期间出现空引用异常

标签 c# wpf combobox selection

让我解释一下我的情况。我有 wpf 用户控件,我在其中动态生成组合框。为此,我使用类 Control Service,我从中创建组合框及其组合框项,并管理每个组合框的选择更改事件。 在我尝试在第一个组合框上引发第二个事件之前,一切都很好。当我尝试清除第二个组合框的项目时出现问题。我做了 debugugg 并且我已经检查过的组合框的引用没有问题(childCmB!= null),但是在尝试清除这个组合框的项目之后。抛出异常。 我尝试在论坛上找到很多案例,但都没有成功,所以我很感激任何解决这个问题的建议。

谢谢

控制服务类:

 static class ControlService
{
    private static ObservableDictionary<String, System.Windows.UIElement> controls = new ObservableDictionary<String, System.Windows.UIElement>();
    private static Grid expanderContent;

    public static Expander createExpander(String header, String name, String code)
    {
        header = manageControlName(header);
        ExpanderModelView expanderModelView = new ExpanderModelView(name);

        //Recieve template grid
        expanderContent = expanderModelView.getExpanderContent();
        //Add in static collection
        Expander expander = new Expander() { Header = header };
        //Code of provider service
        expander.Uid = code;
        expander.Name = name;

        //Set up handler
        expanderContent.AddHandler(System.Windows.Controls.ComboBox.SelectionChangedEvent, new SelectionChangedEventHandler(cmb_SelectionChanged));
        //Insert data
        expander.Content = expanderContent;

        controls.Add(header, expander);
        return expander;
    }

    public static void cleanUIElementCollection()
    {
        controls.Clear();
    }




    private static string manageControlName(string name)
    {
        int counter = 1;
        if (controls.Count != 0)
        {
            foreach (String value in controls.Keys)
            {
                if (value.Equals(name))
                {
                    if (name.Any(char.IsDigit))
                        name = name.Substring(0, name.IndexOf("("));

                    name = String.Format(name + "({0})", counter);
                    counter++;
                }
            }
        }
        return name;
    }

    private static void cmb_SelectionChanged(object sender, SelectionChangedEventArgs e)

    {
        Grid currentContent = sender as Grid;
        String selectedItemId = ((e.Source as System.Windows.Controls.ComboBox).SelectedItem as ComboBoxItem).Uid;
        IEnumerable<Parameter> childCmBs = DataService.getServiceParametersByParentId((e.Source as System.Windows.Controls.ComboBox).Uid);

        if (childCmBs.Any())
        {
            foreach (Parameter param in childCmBs)
            {
                try
                {

                System.Windows.Controls.ComboBox childCmB = currentContent.FindName(param.Key) as System.Windows.Controls.ComboBox;
                if (childCmB != null)
                {
                    childCmB.Items.Clear();
                    addComboBoxItems(DataService.getChildrenParameterValuesByParentId(selectedItemId), childCmB);
                }
                }
                catch (Exception ex)
                {
                    System.Windows.MessageBox.Show(String.Format("Happen some problem during creating comboboxes: {0}", ex.Message));
                }
            }
        }
    }

    public static void createComboBoxes(IEnumerable<Parameter> parameters, System.Windows.Controls.Panel panel)
    {
        foreach (Parameter parameter in parameters)
        {
            TextBlock cmbLabel = new TextBlock() { Text = parameter.Caption };
            System.Windows.Controls.ComboBox cmb = new System.Windows.Controls.ComboBox() { Name = parameter.Key, Uid = parameter.ID };
            panel.Children.Add(cmbLabel);
            panel.Children.Add(cmb);

            addComboBoxItems(parameter.ParameterValue, cmb);
        }
    }

    public static void addComboBoxItems(IEnumerable<ParameterValue> parameterValues, System.Windows.Controls.ComboBox cmb)
    { 
        foreach (ParameterValue value in parameterValues)
        {
            ComboBoxItem item = new ComboBoxItem()
            {
                Content = value.Caption,
                Uid = value.ID,
                Name = value.Key
            };
            cmb.Items.Add(item);
        }
    }

}

最佳答案

我不确定,但我认为问题出在这一行:

String selectedItemId = ((e.Source as System.Windows.Controls.ComboBox).SelectedItem as ComboBoxItem).Uid;

当您清除组合框的项目时,

e.Source as System.Windows.Controls.ComboBox).SelectedItem as ComboBoxItem) 为空

因此,当您尝试获取空项的 Uid 时,它会抛出异常。

关于c# - 选择组合框期间出现空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43627228/

相关文章:

c# - 如何将命令绑定(bind)到列表框项?

C# 代码清理/审计工具(独立于 IDE 之外)

c# - 使用 streamReader.ReadBlock(缓冲区)导入文件

c# - 两个 BackgroundWorker,一个 List<T>

wpf - 在 WPF 中创建可点击的图像

excel - 使用 Excel VBA 中的行值填充组合框

javafx fxml 组合框错误

c# - Microsoft Graph API 无法发送电子邮件 C# 控制台

WPF MVVM 组合框颜色

javafx - 如何获取 TableView 中 ComboBoxTableCell 中选定的值