我在名为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!");
}
}
}
}
答案 0 :(得分:0)
自从我使用Windows窗体做了一些事情以来已经有一段时间了,但您应该能够通过Validating
事件完成此操作。如果你检查它是否有值并相应地设置e.Cancel
,我相信这会给你你想要的行为。
根据我的经验,在该事件中为用户设置某种状态是一个非常好的主意。当用户无法再点击任何地方时,可能会造成混淆。您可以使用MessageBox
或Label
执行此操作。但这确实是一个与你的问题没有直接关系的用户体验问题。
您可能还需要设置一个属性,表明它应该在您离开控件时进行验证,但我不相信这种情况。如果有人确切知道我会更新此答案以反映这一点。
是的,您也可以更改该方法中cityBox
的可见性。