我可以在组合框中添加按钮吗?

时间:2018-10-07 16:03:46

标签: c# winforms

只想知道我是否可以在组合框内执行添加按钮之类的操作,其功能是为组合框添加新值

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以在组合框的可用列表的顶部或底部添加“添加新...”虚拟项。当您检测到它被选中时,您将为新项目的创建提供一个弹出框。当用户在对话框中确认创建后,您便可以刷新组合框的内容,并将组合框中的选择更改为该新创建的项目。如果用户取消了创建对话框,则选择列表中不是“添加新...”项的第一项,如果没有其他可用项,则选择null,以防止再次出现在弹出菜单项中,并且陷入循环之中。

此方法的缺点是您可以添加但不能编辑或删除。想象一下,如果您以这种方式添加新的度量单位,但在其中输入了错误的内容,那么它仍会永久添加到列表中,并且您将无法更改。

您可以考虑为组合框的内容制作一个实际的管理对话框,然后将其放在某个菜单中。然后,用户可以更好地控制将显示在列表中的测量单位。

然后,当关闭该管理对话框时,您将所选选项存储在当前用户界面中的temp变量中,然后用新列表替换组合框的内容,然后查看新列表以查看以前是否-selected选项在其中,如果有,请选择它。

哎呀……您可以把单位经理当作那个虚拟物品。在列表底部创建一个“管理单位...”项,而不仅仅是“添加新...”项,只需打开管理对话框即可。

我当然不知道此UI是针对哪种支持系统构建的...它可以与文件一起使用吗?数据库?我所能做的就是根据屏幕快照中的内容提供建议。


我这样做的方法是将项目列表保留为私有变量。为了方便起见,我在这里只使用private List<String>,但实际上you can put any type in there,只要它公开了显示要显示的字符串的.ToString()方法即可。

然后,我确保始终将虚拟项添加到末尾,并使用选择更改方法检查新选择的索引是否大于内部列表,在这种情况下,唯一可能选择的项是“添加新”。

因此,组合框处理如下:

private const String CREATENEW = "Create new...";
private List<String> measurementUnits; // Fill this up somehow.
private String lastSelectedUnit;
private Boolean loading = false;

public MyForm()
{
    this.InitializeComponent();
    // Fill up the 'measurementUnits' list somehow here.

    // ...

    // Add items to list
    RefreshMeasurementUnits();
}

public Boolean RefreshMeasurementUnits()
{
    Boolean wasLoading = loading;
    loading = true;
    try
    {
        // Last selected actual item.
        String selectedItem = this.lastSelectedUnit;
        Int32 selected = -1;
        for (Int32 i = 0; i < this.measurementUnits.Count; i++)
        {
            String curItem = this.measurementUnits[i];
            // could be adapted if the units in the list are not just simple 'String' class
            if (selectedItem == curItem)
                selected = i;
            this.cmbMeasurementUnits.Items.Add(curItem);
        }
        this.cmbMeasurementUnits.Items.Add(CREATENEW);
        if (selected != -1)
            this.cmbMeasurementUnits.SelectedIndex = selected;
        // Returns true if an item was selected.
        return selected != -1;
    }
    finally { loading = wasLoading; }
}

private void cmbMeasurementUnits_SelectedIndexChanged(Object sender, EventArgs e)
{
    if (loading)
        return;
    // Detect if selected item is the last one.
    if (this.cmbMeasurementUnits.SelectedIndex < this.measurementUnits.Count)
    {
        // store last selected item
        this.lastSelectedUnit = this.cmbMeasurementUnits.SelectedItem as String;
        // exit if the item is not the last one.
        return;
    }
    // Code to add new item here. Only executed if the item is the last one.
    // This should open a dialog that manipulates the contents of the
    // 'measurementUnits' list.
    // If an item was specifically added, this code can change the 'lastSelectedUnit'
    // variable to ensure that it will be the selected item after the refresh.

    // ...

    // Refresh the items list using the 'measurementUnits' list.
    Boolean hasSelection = RefreshMeasurementUnits();
    // if auto-reselect failed, ensure that the selected item is NOT the last one.
    if (!hasSelection)
        cmbMeasurementUnits.SelectedIndex = measurementUnits.Count > 0 ? 0 : -1;
}

答案 1 :(得分:1)

可以,但是您必须从头开始构建自己的自定义控件。

相反,我这样做的方法是在离开组合时检查该值是否在列表中,如果没有,则提供将其添加到位的机会。通常,这是更好的选择,因为用户只需键入即可,而且无需使用不是标准控件集一部分的按钮即可使用。

我个人使用具有NotInList事件的专用组合,但是您可以改用Validating事件。额外事件的优点是,如果添加失败,只需将Cancel设置为true,即可取消休假。

修改

根据下面的请求,以下是如何使用Validating事件处理此问题的示例:

private void MyComboValidating(object sender, CancelEventArgs e)
{
    // Entry is not in the list    
    if (myCombo.Modified && myCombo.Text.Length > 0 && myCombo.SelectedIndex == -1) 
    {
        // AddEntry is a method you would write that shows a dialog to allow the user to
        // add the entry and returns true if the entry is successfully
        //  added or false otherwise 
        if (!AddEntry()) 
        {
            e.Cancel = args.Cancel;
        {
    }
}

很显然,您将myCombo替换为组合框控件的名称。 MyComboValidating是由设计人员创建或您自己创建的事件处理程序。如果您的表单中的名称不同,则可以将其名称中的代码简单地放入处理程序中。

我希望这既清楚又有用。