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

本文关键字:下拉列表 组合 单击 外部 | 更新日期: 2023-09-27 18:13:19

我在一个名为countrybox的组合框中显示世界上所有的国家。

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

当你选择国家时,citybox出现,当你打开countrybox时,citybox又消失了。

问题出现当你打开citybox并点击它的外面。

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!");
        }
      }
    }
  } 

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

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

根据我的经验,在事件中设置某种对用户可见的状态是一个非常好的主意。当用户不再能够点击任何地方时,这可能会令人困惑。你可以用MessageBoxLabel来做。但这确实是一个UX问题,与你的问题没有直接关系。

您可能还必须设置一个属性,表明在离开控件时应该进行验证,但我认为情况并非如此。如果有人知道,我会更新这个答案,以反映这一点。

是的,你也可以在这个方法中改变cityBox的可见性