【问题标题】:SelectedIndexChanged Not Firing in WinForms for Controls Generated at Runtime运行时生成的控件在 WinForms 中未触发 SelectedIndexChanged
【发布时间】:2014-09-29 20:54:14
【问题描述】:

我的额头因在这张桌子上撞到我的桌子而被擦伤。

我有一个表单,它根据传递给它的参数生成一堆自定义用户控件(FieldMapper 对象)。 FieldMapper UserControl 本质上只是在 TableLayoutPanel 上组织的几个标签、一个 BindingSource 和一个 ComboBox(绑定到 BindingSource)。此 UserControl 上的 ComboBox 设置为 DropDownList 并绑定到 BindingSource,该 BindingSource 填充有在构造时作为参数传递的 IList。

FieldMapper 有一个名为 MappingChanged 的​​事件,每当触发底层 SelectedIndexChanged 事件时都会触发该事件,并且某些逻辑会确定随事件触发的 MappingChangedEventArgs 的参数。这用于从其他组合框中删除/添加项目,因此在一系列 FieldMapping 控件中不能选择两次

问题是 ONLY ONE 控件触发底层 SelectedIndexChanged 事件。这个控件是我首先更改它的 ComboBox 的选定值/索引的任何控件。我选择哪一个并不重要,但只有那个控件会触发后续事件,尽管其他控件的组合框已更改。

这是 FieldMapper 的构造函数(删除了与问题无关的参数)

public FieldMapper(IList<string> fields)
{
        InitializeComponent();

        fields = fields.OrderBy(s => s).ToList();
        string[] copyBuffer = new string[fields.Count + 1];
        fields.CopyTo(copyBuffer, 1);
        copyBuffer[0] = "NONE";
        AvailableMappings = new BindingList<string>(copyBuffer.ToList());
        AvailableMappings.RaiseListChangedEvents = true;

        bindingSource = new BindingSource();
        mapSelector.DataSource = bindingSource;
        bindingSource.DataSource = AvailableMappings;

        mapSelector.SelectedItem = "NONE";
        mapSelector.SelectedIndexChanged += mapSelector_SelectedIndexChanged;
}

这些 FieldMapper 控件的父窗体按如下方式生成它们:

private void BuildMappingTable(IEnumerable<string> fieldNames)
{
    int row = 0;
    foreach (var field in fbProject.Fields)
    {
        FieldMapper mapper = new FieldMapper(field.Key, field.Value.FieldName, fieldNames.ToList());
        mapper.EnableMappingField = false;
        mapper.Anchor = AnchorStyles.Right | AnchorStyles.Left;
        mapper.MappingChanged += MappingChanged;
        mappingTable.Controls.Add(mapper, 0, row);
        row++;
    }   
    if (!built && !original)
        SetInitialValues()

    built = true;
}

当我在调试此问题时检查断点时,始终为 FieldMapper 和 FieldMapper 的组合框的 SelectedIndexChanged 事件填充事件处理程序,所以我不确定它们为什么不触发。

编辑:这里要求的是 mapSelector_SelectedIndexChanged 方法

private void mapSelector_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (currentValue == null || currentValue.Equals("NONE"))
        {
            currentValue = (string)mapSelector.SelectedItem;
            OnMappingChanged(new MappingSelectedEventArgs(MappingSelectedEventArgs.MappingSelectedAction.SET, currentValue));
        }
        else if (mapSelector.SelectedItem.Equals("NONE"))
        {
            OnMappingChanged(new MappingSelectedEventArgs(MappingSelectedEventArgs.MappingSelectedAction.REMOVED, currentValue));
            currentValue = "NONE";
        }
        else if (!mapSelector.SelectedItem.Equals(currentValue))
        {
            OnMappingChanged(new MappingSelectedEventArgs(MappingSelectedEventArgs.MappingSelectedAction.CHANGED, currentValue,
                (string)mapSelector.SelectedItem));
            currentValue = (string)mapSelector.SelectedItem;
        }
    }

    protected void OnMappingChanged(MappingSelectedEventArgs args)
    {
        if (MappingChanged != null)
            MappingChanged(this, args);
    }

【问题讨论】:

  • 能否为 mapSelector_SelectedIndexChanged 添加正文?
  • 你的代码在我看来没问题。
  • @Kroonwijk 现在更新它

标签: c# winforms events data-binding


【解决方案1】:

替换:

private void mapSelector_SelectedIndexChanged(object sender, EventArgs e)

作者:

private void bindingSource_CurrentChanged(object sender, EventArgs e)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多