0

我有一个带有 2 个控件的WinForms对话框。ListBox在正在测试的应用程序中,双击列表框控件之一(我将其称为 CONTROL LISTBOX)中的任何项目会导致选择另一个列表框(SLAVE LISTBOX)中的匹配项。

我的测试导致在控制列表框中输入多个条目。然后测试ListBox.SelectedItem.DoubleClick()对每个 CONTROL lISTBOX 项目执行 a,比较ListBox.SelectedItemText两个列表框控件的。

在应用程序 UI 中,这始终有效,但ListBox.SelectedItemText对 SLAVE LISTBOX 的调用测试仅在双击\比较的初始迭代中返回与 UI 中选择的内容正确匹配的文本。

谁能帮我弄清楚我做错了什么?谢谢!

这是我的代码:

public bool SelectMainEventViaErrorEvent(int eventIdx)
{
    bool bSuccess = false;

    errorEvents.Items.Select(eventIdx);
    System.Threading.Thread.Sleep(1000);

    errorEvents.Items.SelectedItem.DoubleClick();
    System.Threading.Thread.Sleep(1000);

    if (eventIdx > 0)
    {
        IVScrollBar vertScroll = mainEvents.ScrollBars.Vertical;
        vertScroll.ScrollDownLarge();
    }

    if (errorEvents.SelectedItemText == mainEvents.SelectedItemText)
    {
        bSuccess = true;
    }

    log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected error event = {errorEvents.SelectedItemText}");
    log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected main event = {mainEvents.SelectedItemText}");

    return bSuccess;
}

如您所见,通过下图,两个列表框中的文本是相同的。但是,对ListBox.SelectedItemText顶部列表框 (SLAVE LISTBOX) 的调用返回第一次迭代的值,该值与双击/比较的第一次迭代期间底部列表框 (CONTROL LISTBOX) 中的第一项匹配。

证明所选列表框项目的文本匹配

4

2 回答 2

0

与纯文本比较是个坏主意,因为“文本”!=“文本”。您可以在您的情况下使用的是DisplayMemberValueMember属性。

我将通过手动填充列表框为您演示它,但您可以从数据库中执行此操作,或者您可以执行此操作。

首先创建class将存储您的值和它的 ID。我通常像这样创建它(所以我以后可以将该类用于其他用途)

public class Int_String
{
    public int _int { get; set; } // Important to be declared like properties and not like variables
    public string _string { get; set; }
}

现在让我们像这样填充我们的列表框:

public YourForm()
{
    List<Int_String> list = new List<Int_String>();
    list.Add(new Int_String { _int = 1, _string = "Some text" }); // I am populating it manually but you will populate it from DB or somewhere else
    list.Add(new Int_String { _int = 2, _string = "Some other text" });
    list.Add(new Int_String { _int = 3, _string = "One more text" });

    // Now when we have list we need to bind it to our listbox.

    // IMPORTANT!!!!!
    // Display member and Value member properties SHOULD be able to be added before and after assigning datasource to control (like combobox) BUT for some reason on listbox it only works when you assign it AFTER you bind your datasource to listbox.
    // If you ever work with other controls and use these values, ALWAYS declare display member and value member BEFORE you bind datasource. Why? For now let's just say it is much faster but explanation is for other question

    myListBox1.DataSource = list;
    myListBox1.DisplayMember = "_string"; // When you start typing .DisplayMember, you will not get that property in recommendation since it is hidden so do not think there is not that property there.
    myListBox1.ValueMember = "_int"; // Same as above
}

现在,当您使用相同的 id 以相同的方式填充这样的列表框和第二个列表框时,您可以简单地做if(listbox1.SelectedValue == listbox2.SelectedValue)并比较它们,即使它们的文本不相等但 id 是。

奖励:您还可以像这样扩展类:

public class Int_String
{    
    public int _int { get; set; }
    public string _string { get; set; }

    public string SomethingOther = "AsD";


    public bool IsTrue()
    {
        return true;
    }
}

然后以相同的方式绑定它并执行以下操作:

Int_String item = listbox1.SelectedItem as Int_String;
bool check = item.IsTrue();
MessageBox.Show(item.SomethingOther);

所以基本上你为列表框中的每个项目绑定整个类,向用户显示一个变量(在我们的例子中_string),设置ValueMember为其他唯一变量,以便搜索整个列表框,并在需要时从该项目中获取整个类。

于 2019-01-17T10:40:36.057 回答
0

我无法通过errorEvent在我的自动化测试代码中向前迭代列表框来完成这项工作,但是在向后迭代errorEvent列表框时它确实有效。

调用代码:

            for (int i = eventViewer.GetErrorEventsCount() - 1; i >= 0; i--)
        {
            bResult = eventViewer.SelectMainEventViaErrorEvent(i);
            if (!bResult)
            {
                break;
            }

            System.Threading.Thread.Sleep(2000);
        }

验证码:

        public bool SelectMainEventViaErrorEvent(int eventIdx)
    {
        bool bSuccess = false;
        DisableToolTips(true);

        errorEvents.Select(eventIdx);
        errorEvents.SelectedItem.DoubleClick();

        System.Threading.Thread.Sleep(1000);

        log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected error event = {errorEvents.SelectedItemText}");
        log.Info($"SelectMainEventViaErrorEvent({eventIdx}) selected main event = {mainEvents.SelectedItemText}");

        if (errorEvents.SelectedItemText == mainEvents.SelectedItemText)
        {
            bSuccess = true;
        }

        return bSuccess;
    }
于 2019-01-23T14:56:08.983 回答