Как это работает с текстовыми полями в выигрышных формах - PullRequest
3 голосов
/ 23 декабря 2010

Я изучаю C # для своих школьных домашних заданий. Я внезапно пытаюсь что-то сделать, и я подумал, что я собираюсь получить ошибку в коде ниже

  private void ClearControls()
        {
            this.textBox1 .Text = "";
            this.textBox1 = this.textBox2 = this.textBox3 = this.textBox4;
        }

Ух ... это работает лучше, чем я ожидал, и очистило все мои текстовые поля в форме, а до этого я делал как

textBox1 .Text = "";
textBox2 .Text = "";

и так далее, до примерно двадцати текстовых полей в форме (это метод, сказал мне мой учитель, и все мои одноклассники следуют этому :() ..

какой из них правильный, и почему первый работает хорошо, и как атрибут по умолчанию, назначаемый текстовому полю, всегда является текстом, а не именем или табельным индексом или какими-либо другими?

если вопрос неясный или небольшой беспорядок, скажите, пожалуйста, и я постараюсь изменить его.

Спасибо, что нашли время прояснить мои сомнения: D

Ответы [ 5 ]

4 голосов
/ 23 декабря 2010

Не совсем.Эта строка устанавливает каждую ссылку равной textBox4, а это не то, что вам нужно.Теперь все эти четыре ссылки указывают на одно и то же.

this.textBox1 = this.textBox2 = this.textBox3 = this.textBox4

То, что вы хотели, было так:

this.textBox1.Text = this.textBox2.Text = this.textBox3.Text = this.textBox4.Text = ""

Однако это головная боль при обслуживании.Создайте UserControl для этого материала или, по крайней мере, поддерживайте коллекцию объектов TextBox, которые вы можете перебирать, чтобы установить общие свойства вместо добавления новой строки для каждого текстового поля.

3 голосов
/ 23 декабря 2010

Вы также можете использовать Linq ...

Controls.OfType<TextBox>().ToList().ForEach(tb => tb.Text = "");
1 голос
/ 23 декабря 2010

Люди дали несколько хороших альтернатив и комментариев, но позвольте мне ответить на вопрос, что именно происходит в этих строках кода .

Извините, если это слишком просто, но вы действительно сказали, что вы только изучали C #. :)

this.textBox1.Text = "";
this.textBox1 = this.textBox2 = this.textBox3 = this.textBox4;

Во-первых, поймите, что textBox1, textBox2 и т. Д. Являются ссылками на объекты типа TextBox, которые содержатся в вашем Form. Каждый TextBox имеет свойство с именем Text типа string. Если я правильно понимаю, вы хотели бы удалить текст из всех четырех текстовых полей в вашей форме, то есть вы хотите установить значение свойства Text для каждого TextBox в пустую строку "".

Ваша первая строка кода делает это, но только для первой TextBox. Однако вторая строка кода, как указали другие, присваивает каждой ссылке textBox<n> ссылку на тот же TextBox, что и textBox4. Если textBox4.Text окажется пустой строкой, появится , чтобы делать то, что вы хотите, но на самом деле вы изменили состояние ссылок на сами TextBoxes, а не значения в каждый TextBox Text свойство.

Убедитесь, что вы понимаете разницу между установкой задания (textBox1 = textBox2) и установкой свойства (textBox1.Text = textBox2.Text). В первом случае вы перешли от ссылок на два TextBox к двум ссылкам на один и тот же TextBox. Чтобы просто удалить TextBoxes, вам нужен второй случай, который просто копирует значение свойства.

Короче говоря, учитывая это (надеюсь, не слишком запутанное) объяснение, ваш код, как указано, должен стать следующим:

this.textBox1.Text = "";
this.textBox4.Text = this.textBox3.Text = this.textBox2.Text = this.textBox1.Text;

Но, строго говоря, вам гораздо лучше , используя такие решения, как @ Тима Джарвиса или @ Брэндона , которые работают независимо от того, сколько текстовых блоков у вас есть на форме.

Удачи! :)

1 голос
/ 23 декабря 2010

А это другой способ

Это то, что вы хотите?

foreach (Control item in this.Controls)
        {
            if (item.GetType() == typeof(TextBox))
                ((TextBox)item).Text = "";
        }
1 голос
/ 23 декабря 2010

Цикл управления всегда есть вариант ...

foreach (Control objControl in this.Controls) 
{
     if (objControl is TextBox) 
     {
          ((Textbox)objControl).Text = String.Empty;
     }
}
...