【问题标题】:Determining the type of Event that was raised on List Box, Selected Index Change. C#确定在列表框中引发的事件类型,选定索引更改。 C#
【发布时间】:2013-07-12 13:46:43
【问题描述】:

我知道有很多 Listbox Select 索引更改问题。但是,这个问题关注的是不同的问题。我有一个列表框,表单上有一些字符串。我想要完成的是能够滚动列表框中的项目(即使用箭头键导航到特定项目)。一旦我导航到我想要的项目,我希望能够在项目上按 enter 并继续我的申请。因此,问题是如何确定在列表框中引发的事件类型,以便将事件与鼠标单击事件或 Keydown 事件进行比较,从而允许我根据结果决定执行哪个条件语句布尔表达式的......我需要确定类型的原因是因为如果用户在 selectedIndexed Item 上按下 ENter 会出现一个对话框,当前每次用户突出显示一个新项目时都会出现该对话框(您可以看到是个问题)。

伪代码

    if (Listbox_Selected_Event_EventType isEqualTo Mouse_Click)
    {
        // execute code
    } else if (Listbox_Selected_Event_EventType isEqualTo KeydownEvent)
          {
             // execute code
          }

感谢 Evan 完成的代码,

    private void listBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                var file = Directory.GetFiles(urlHistoryFolder, listBox1.Text).FirstOrDefault();
                String line;
                try
                {
                    using (StreamReader sr = new StreamReader(file))
                    {
                        line = sr.ReadToEnd();
                    }

                    DialogResult result1 = MessageBox.Show("Are You sure you want to Load this WebService", "Important Question", MessageBoxButtons.YesNo);
                    if (result1 == DialogResult.Yes)
                    {
                        //MessageBox.Show("Loading WebService");
                        textEndPointUri.Text = line;
                        listBox1.Visible = false;
                        GetBtn_Click(sender, e);
                    }
                }
                catch (Exception exp)
                {
                    Console.WriteLine("File could not be read:");
                    Console.WriteLine(exp.Message);
                }
            }
        }
    }

【问题讨论】:

  • SelectedIndexChanged 在您每次选择 ListBox 中的项目时触发。我将分别处理MouseClickKeyUp 事件,并为两者添加代码以执行您想要的操作。这些事件的命名相当合乎逻辑,因此确定要处理哪些事件应该没有问题。
  • 仍然,您必须确定是否选择了某个项目,每次您单击该表单时都会触发 mouseClick 方法..这违背了目的。你基本上只是重复了我最初的问题。
  • 您可以确定是否或在两个事件处理程序中选择了哪个项目。我在下面的答案中添加了一些代码。此外,鼠标单击事件会在表单上的各个控件上触发,而不是每次单击时都会触发每个控件。 listBox1_Click 在您单击 ListBox 时触发,Form1_Click 在您单击表单本身时触发等...只需处理单个控件的单击即可。

标签: c# .net listbox comparison selectedindexchanged


【解决方案1】:

问题是您正在查看错误的事件。您应该处理列表框上的MouseClick 事件和KeyUpKeyDown 事件。

    private void listBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            //Get the selected item and do whatever you need to it
            //Open your dialog box

        }
    }

    private void listBox1_Click(object sender, MouseEventArgs e)
    {
        //Get the selected item and do whatever you need to it
        //Open your dialog box
    }

那么就不需要条件了,因为您已经分别处理了这两个事件。确保从SelectedIndexChanged 事件中删除对话框代码。

编辑: 每次您在 ListBox 对象中选择和项目时,SelectedIndexChanged 都会触发。即使您不处理该事件,该框仍会存储索引。因此,您可以在任何地方引用或操作SelectedIndex 的属性。如果您处理上述两个事件,则任何时候用户单击某个项目或按 Enter 键时,您都会检查是否有选定的项目:

if (listBox1.SelectedIndex != -1)
{
    //Now we know you have an item selected
    //Do some stuff
}

【讨论】:

  • 焦点不是对话框。每次发生该操作时,这些方法都会再次触发。如果我要实现这一点并且相信我在发布之前已经尝试过 Way,那么什么都不会改变。我需要一种方法来判断一个项目是否被选中。这就是我选择 Selected Index Changed 的​​原因。
  • 无需像您的外壳所暗示的那样粗鲁或大喊大叫。只需添加if (listBox1.SelectedIndex != -1) { //we know something is selected },它会告诉您是否选择了某个项目
  • 不,我不是故意粗鲁的,我的朋友,尤其是当我是接受帮助的人时。我把这句话大写只是为了表明它很重要。
  • 我添加了一些内容,希望能帮助您阐明如何确定 KeyUpClick 事件处理程序中的选定索引。
  • 你是对的,哈哈。我不敢相信我忘记了 !=-1 检查...我使用了很多次...无论如何谢谢 Evan。
【解决方案2】:

向窗体添加一个按钮并将窗体的 AcceptButton() 属性设置为该按钮。现在,当按下 Enter 时,Button 将触发。在 Button Click() 处理程序中显示您的对话框。这还有一个额外的好处,即人们也可以单击按钮而不是按 Enter:

    private void button1_Click(object sender, EventArgs e)
    {
        if (ListBox.SelectedIndex != -1)
        {
            // ... display the dialog ...
            Console.WriteLine(ListBox.SelectedItem.ToString());
        }
    }

【讨论】:

  • 虽然我的被标记为答案,但这对 OP 来说是有用的信息,并最终回答了SelectedIndex 问题。 +1
【解决方案3】:

确定是否按下了 ENTER:

private void listBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Return)
        // do something
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多