Почему TextBox в Visual c# продолжает удалять и добавлять себя? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытался создать приложение формы windows, где я программно создаю TextBox после выполнения определенных условий. Однако, когда я по какой-то причине запускаю код, он работает так, как если бы не было операторов if. Я попытался добавить больше условий, чтобы предотвратить это, и я также попытался посмотреть, были ли найдены какие-либо условия истинными, когда они должны были быть ложными. Я не знаю что делать Вот мой код:

private void fmaEquation(object sender, EventArgs e)
{
    // get whether any textboxes hold any of these strings
    bool f = IfVarIsThere("f");
    bool m = IfVarIsThere("m");
    bool a = IfVarIsThere("a");
    // if textbox has not been added but 2 of 3 variables are given
    Console.WriteLine("F: " + f + " M: " + m + " A: " + a + " eqNum: " + eqNum + " Contains? " + this.Controls.Contains(eq[eqNum]));
    if (!(this.Controls.Contains(eq[eqNum])) && ((f && m) || (m && a) || (f && a)))
    {
        eq[eqNum] = new TextBox();
        eq[eqNum].Location = new System.Drawing.Point(10 + 3 * txtSize, 30 + eqNum * 20);
        eq[eqNum].Size = new System.Drawing.Size(txtSize, 10);
        this.Controls.Add(eq[eqNum]);
        eq[eqNum].Text = "f = m * a";
    }
    // else, if the textbox is there, but 2 of 3 variables are not there
    else if ( !((f && m) || (m && a) || (f && a)) && this.Controls.Contains(eq[eqNum]))
    {
       this.Controls.Remove(eq[eqNum]);
    }
}

private bool ifVarIsThere(String s) // loop through array to see whether String s is in any of the variable textboxes
{
    for (int i = 0; i < varNum; i++)
    {
        if (var[i].Text.ToLower() == s)
        {
            return true;
        }
    }
    return false;
}

По какой-то причине текстовое поле будет добавлять себя, затем удалять себя, затем повторно добавлять себя и повторять в бесконечном цикле. Я также запускаю этот метод в фоновом режиме.

1 Ответ

0 голосов
/ 12 февраля 2020

Я не знаю, если Idle это событие, которое вы хотите здесь. Idle срабатывает всякий раз, когда Thread переходит в состояние Idle. Если вы перейдете к go, отключив это событие и связавшись с формой, она изменит состояние, а затем вернется и снова будет свободна, вызывая бесконечное l oop при добавлении элементов управления.

Затем, поскольку вы добавляете текстовое поле с буквально текстом «f = m + a», в следующий раз вы всегда будете вызывать команду «Удалить логи» c, потому что в только что добавленном вами поле был текст, который вы искали.

Я бы либо go отключил какое-то другое событие, либо вы должны удалить эту строку:

eq[eqNum].Text = "f = m * a";
...