Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在确定在列表框上引发的事件类型,选定的索引更改。C_C#_.net_Listbox_Comparison_Selectedindexchanged - Fatal编程技术网

C# 正在确定在列表框上引发的事件类型,选定的索引更改。C

C# 正在确定在列表框上引发的事件类型,选定的索引更改。C,c#,.net,listbox,comparison,selectedindexchanged,C#,.net,Listbox,Comparison,Selectedindexchanged,我知道有一些列表框选择索引更改的问题。然而,这个问题集中在另一个问题上。我有一个列表框,表单上有一些字符串。我试图实现的是能够滚动列表框中的项目,即使用箭头键导航到特定项目。导航到所需的项目后,我希望能够按该项目上的enter键并继续我的应用程序。因此,问题是如何确定在列表框中引发的事件类型,以便将该事件与鼠标单击事件或按键事件进行比较,因此,允许我根据布尔表达式的结果决定要执行哪条条件语句……我需要确定类型的原因是,如果用户在selectedIndexed项上按ENter键,将出现一个对话框,

我知道有一些列表框选择索引更改的问题。然而,这个问题集中在另一个问题上。我有一个列表框,表单上有一些字符串。我试图实现的是能够滚动列表框中的项目,即使用箭头键导航到特定项目。导航到所需的项目后,我希望能够按该项目上的enter键并继续我的应用程序。因此,问题是如何确定在列表框中引发的事件类型,以便将该事件与鼠标单击事件或按键事件进行比较,因此,允许我根据布尔表达式的结果决定要执行哪条条件语句……我需要确定类型的原因是,如果用户在selectedIndexed项上按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);
                }
            }
        }
    }

要确定是否已按ENTER键,请执行以下操作:

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

问题是你看的是错误的事件。您应该在列表框中处理MouseClick事件和KeyUp或KeyDown事件

    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事件中删除对话框代码

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

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

向表单添加按钮,并将表单的AcceptButton属性设置为该按钮。现在,当按下回车键时,按钮将启动。在按钮单击处理程序中显示对话框。这样做的另一个好处是,用户也可以单击按钮而不是按Enter键:

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

SelectedIndexChanged会在每次选择列表框中的项目时激发。我只需要分别处理MouseClick和KeyUp事件,并为这两个事件添加代码,以完成您想要的操作。事件的命名非常合理,因此确定要处理哪些事件应该没有问题。不过,您必须确定是否选中了某个项目,每次单击该表单时都会触发mouseClick方法。。这违背了目的。你基本上只是转述了我原来的问题。你可以确定是否或哪个项目是在两个事件处理程序中选择的。我在下面的答案中添加了一些代码。此外,鼠标单击事件会激发窗体上的单个控件,而不是每次单击时都激发每个控件。当您在列表框中单击时,会触发listBox1\u Click,当您单击表单本身时,会触发Form1\u Click等。。。只需处理单个控件的单击。焦点不是对话框。同样,每次操作发生时,这些方法都会触发。若我实现了这一点,并相信我在发布这篇文章之前已经试过了,那个么一切都不会改变。我需要一种方法来判断是否选择了某个项目。这就是为什么我在第一时间选择了“已更改的选定索引”。不必像你的外壳所暗示的那样粗鲁或大喊大叫。如果listBox1.SelectedIndex!=-1{//我们知道有东西被选中了}这会告诉你是否选中了某个项目不,我不是有意粗鲁,我的朋友,尤其是当我是接受帮助的人时。我把这个短语大写,只是为了说明它的重要性。我添加了一点,希望能帮助澄清如何在KeyUp或Click事件处理程序中确定所选索引。你是对的,哈哈。我不敢相信我忘记了=-1检查。。。我用了很多次。。。。不管怎样,谢谢你,埃文。虽然我的答案被标记为答案,但这对OP来说是有用的信息,并最终回答了SelectedIndex问题+1.