-1

在构造函数中我做了:

if (listBox1.Items != null)
            {
                listBox1.Focus();
            }

但是当我运行程序时,我无法在 listBox 中上下移动键盘,因为焦点位于表单中其他位置的按钮上。我需要在 listBox 上单击鼠标才能获得焦点。

我想要的另一个问题是,当用户向 listBox 添加新项目时,焦点将自动放在最后添加的项目上。对于这个问题,这是我向 listBox 添加新项目的代码:

private void KeysValuesUpdate()
        {
            using (var w = new StreamWriter(keywords_path_file))
            {
                crawlLocaly1 = new CrawlLocaly();
                crawlLocaly1.StartPosition = FormStartPosition.CenterParent;
                DialogResult dr = crawlLocaly1.ShowDialog(this);
                if (dr == DialogResult.OK)
                {
                    if (LocalyKeyWords.ContainsKey(mainUrl))
                    {
                        LocalyKeyWords[mainUrl].Clear();
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
                    }
                    else
                    {
                        LocalyKeyWords[mainUrl] = new List<string>();
                        LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
                    }
                    Write(w);
                    ClearListBox();
                }
                if (dr == DialogResult.Cancel)
                {
                    Write(w);
                }
            }
        }

        private void ClearListBox()
        {
            data.Clear();
            listBox1.DataSource = null;
            string sb;
            foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
            {
                for (int i = 0; i < kvp.Value.Count(); i++)
                {
                    sb = "Url: " + kvp.Key + " --- " + "Local KeyWord: " + kvp.Value[i] + Environment.NewLine;
                    data.Add(sb.ToString());
                }
            }
            listBox1.DataSource = data;
        }

问题是为什么我不能在 listBox 项目的任何情况下设置焦点?

在构造函数的第一种情况下,我希望它位于列表中的最后一个项目上,并且每次我添加一个新项目时,焦点都将位于最后一个添加的项目上。

4

2 回答 2

1

最有可能的,正在选择该项目,您只是无法分辨,因为不同的控件具有焦点。有几种不同的方法可以解决这个问题,具体取决于应用程序的设计。

  1. 对于问题的第一部分,您应该在Page/Form Load 事件中设置焦点,因为在构造函数级别控件处于初始化过程中。ListView每当显示表单时,将焦点设置为第一个。用户通常通过单击控件来设置焦点。但是,您也可以指定哪些控件以编程方式获得焦点。一种方法是将控件的选项卡索引设置为 0(最小值表示将具有初始焦点的控件)。第二种可能性是在表单的Load事件中使用以下代码行,或者在设置Selected属性后立即使用:

    listBox1.Select();
    

    此解决方案的问题在于,当用户将焦点设置到表单上的不同控件(例如文本框或按钮)时,所选项目将不再突出显示。

  2. 对于问题的第二部分,选择 ListBox 中最后添加的项目,使用以下代码:

    listBox1.SelectedIndex = listBox1.Items.Count - 1;
    listBox1.SetFocus();
    
于 2012-10-18T17:44:32.977 回答
0

看起来你的ClearListBox方法实际上是一种UpdateListBox方法。

listBox1.DataSource = data; 

listBox1.SelectedIndex = <index of newitem>;
// or
listBox1.SelectedItem = "text of new item";

listBox1.SetFocus();

如果新项是最后一项,则其索引为listBox1.Items.Count - 1

于 2012-10-18T17:45:42.397 回答