当在其外部单击时,不允许组合框下拉列表关闭

时间:2014-07-16 21:09:50

标签: c# combobox

我在名为countrybox的组合框中显示所有世界各国。

第二个组合框包含一个名为citybox的国家/地区的所有城市。

当您选择某个国家/地区时,系统会显示citybox,当您打开countrybox时,citybox会再次消失。

当您打开citybox并在其外部点击时,会出现问题。

当你离开时,{p> citybox消失了 打开countrybox,当您点击countrybox之外时,它就不会回来。

我试过这个:

string ctext { get; set; }

private void countrybox_SelectedIndexChanged(object sender, EventArgs e)
    {
        citybox.Visible = true;
        string ctext = countrybox.Text;
}


private void countrybox_DropDownClosed(object sender, EventArgs e)
    {
        if (countrybox.Text == ctext)
        {
            citybox.Visible = true;
        }
        else
        {
            citybox.Visible = false;
        }

然而,这并不像我想要的那样有用。

我猜这是因为Combobox类无法识别框外的点击作为_DropDownClosed事件。

我也尝试过使用 验证事件以检查用户是否点击了表单

 private void countrybox_Validating(object sender, CancelEventArgs e)
    {
        if (string.Equals((sender as Form).Name, @"Form1") && string.IsNullOrEmpty(countrybox.Text))
        {
            e.Cancel = true;
            MessageBox.Show("You have to select a country!");
        }
    }

是否有任何方法使组合框下拉列表在列表外单击时不关闭?

如果我有拼写错误,我道歉,我的母语不是英语。

为需要更多详情的人发布以下完整代码。

   
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] Countries = File.ReadAllLines(@"C:\Travelbureau\Countries.txt");
        Array.Sort(Countries);
        for (int i = 0; i < Countries.Length; i++)
        {
            countrybox.Items.Add(Countries[i]);
        }
    }
    string ctext { get; set; }

    private void countrybox_SelectedIndexChanged(object sender, EventArgs e)
    {
        citybox.Visible = true;
        string ctext = countrybox.Text;

        switch (countrybox.Text)
        {
            case "Afghanistan":
            string[] AfgCity = File.ReadAllLines(@"C:\Travelbureau\Afghanistan.txt");
            Array.Sort(AfgCity);
            for (int i = 0; i < AfgCity.Length; i++)
            {
                citybox.Items.Add(AfgCity[i]);
            }
            break;
            default:
            citybox.Text = "City";
            citybox.Items.Clear();
            break;
        }
    }

    private void countrybox_DropDown(object sender, EventArgs e)
    {
        citybox.Visible = false;
    }

    private void countrybox_DropDownClosed(object sender, EventArgs e)
    {
        if (countrybox.Text == ctext)
        {
            citybox.Visible = true;
        }
        else
        {
            citybox.Visible = false;
      }
    private void countrybox_Click(object sender, EventArgs e)
    {
        countrybox.Text = "";
        citybox.Visible = false;
    }

    private void citybox_Click(object sender, EventArgs e)
    {
        citybox.Text = "";
    }

    private void countrybox_Validating(object sender, CancelEventArgs e)
    {
        if (string.Equals((sender as Form).Name, @"Form1") && string.IsNullOrEmpty(countrybox.Text))
        {
            e.Cancel = true;
            MessageBox.Show("You have to select a country!");
        }
      }
    }
  } 

1 个答案:

答案 0 :(得分:0)

自从我使用Windows窗体做了一些事情以来已经有一段时间了,但您应该能够通过Validating事件完成此操作。如果你检查它是否有值并相应地设置e.Cancel,我相信这会给你你想要的行为。

根据我的经验,在该事件中为用户设置某种状态是一个非常好的主意。当用户无法再点击任何地方时,可能会造成混淆。您可以使用MessageBoxLabel执行此操作。但这确实是一个与你的问题没有直接关系的用户体验问题。

您可能还需要设置一个属性,表明它应该在您离开控件时进行验证,但我不相信这种情况。如果有人确切知道我会更新此答案以反映这一点。

是的,您也可以更改该方法中cityBox的可见性。