繁体   English   中英

在运行时生成的控件的WinForms中未触发SelectedIndexChanged

[英]SelectedIndexChanged Not Firing in WinForms for Controls Generated at Runtime

我的额头因撞到我的桌子上的桌子而被撞伤。

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

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

问题在于, 只有一个控件会触发基础的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的comobobox的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);
    }

更换:

private void mapSelector_SelectedIndexChanged(object sender, EventArgs e)

通过:

private void bindingSource_CurrentChanged(object sender, EventArgs e)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM