2013-11-11 2 views
0

У меня есть 10 текстовых полей txt_Address1, txt_Address2 ... txt_Address10 и 10 столбцов для хранения их значений в базе данных, то есть Address1, Address2 ... Address10. Теперь я хочу получить каждое значение текстового поля и сохранить его в соответствующем столбце. Для этого вместо того, чтобы писать 10 строк кода для каждого текстового поля, я хочу сделать это по циклу FOR. Может ли кто-нибудь предложить мне подходящее решение?Получение значений текстового поля через цикл

+0

вы можете создать массив и добавить все txt_Ad ... к нему. TextBox [] textBoxes = new TextBox [] {txt_Addr1, txt_Addr2, ...}. И перейдем к этому. – hawk

+0

см. Мой ответ, вы можете добавить все текстовое поле в список или добавить его в массив и закодировать его, TextBox является ссылочным типом, что означает, что объявление TextBox a = txt_address10 не делает его копию, вместо этого оно создает указатель на txt_address10 – lostincomputer2

+0

Убедитесь, что вы действительно хотите это сделать. Люди рассказывают вам, как это выглядит, но это похоже на плохой дизайн базы данных и, как следствие, трату времени. См. Мой ответ ниже. – user1646737

ответ

0

Просто укажите текстовое поле в массиве TextBox;

TextBox txt1 = new TextBox(); 
TextBox txt2 = new TextBox(); 
TextBox txt3 = new TextBox(); 
TextBox txtN = new TextBox(); 

TextBox[] allTextBoxes = new TextBox[] { txt1, txt2, txt3, txtN }; 

foreach(TextBox item in allTextBoxes) 
{ 
StoreValue(item.Text); 
} 

ИЛИ вы можете использовать

List<TextBox> lst = new List<TextBox>(); 
lst.Add(txt1); 
lst.Add(txt2); 
lst.Add(txt3); 

foreach(TextBox item in lst) 
{ 
    StoreValue(item.Text); 
} 
+0

Но в этом случае мне также нужно объявить 10 текстовых полей для каждого из моих текстовых полей. Может ли это быть сделано циклом FOR вместо цикла foreach? –

+0

уверен, что вы можете создать текстовое поле динамически и поместить его в форму: – lostincomputer2

+0

Список lst = new Список (); for (int i = 0; i <10; i ++) {TextBox txt = new TextBox(); lst.Add (TXT); form1.Controls.Add (TXT); txt.Top = (i + 1) * 20; DoSomething (txt.Text); } – lostincomputer2

0

Вы можете поместить их в список, и перебирать этот список ...

Edit: Кажется lostincomputer ответил двадцать секунд впереди меня ... такой же ... обе будут работать

1

Когда вы создаете текстовые поля, храните их в коллекции

List<TextBox> textboxControls = new List<TextBox>(); 

Затем, когда вы создаете их, добавить их в коллекцию

textboxControls.Add(control); 

После этого вы можете петля над ними, и получить доступ к их значения

foreach(var control in textboxControls) 
    DoSomethingWithText(control.Text); 
0

Или вы можете получить к ним доступ из формы без перечня:

foreach(Control control in MyForm.Controls) 
{ 
    if(control is TextBox) 
    { 
     //do what you want 

    } 
} 

Если у вас их есть в группеBox

foreach(Control control in myGroupBox.Controls) 
{ 
    if(control is TextBox) 
    { 
     //do what you want 
    } 
} 

Надеюсь, это поможет!

Или с циклом:

//Controls is the Controls collection of the form 
for(int i=0;i<Controls.Count;i++) 
     { 
      if(Controls[i] is TextBox) 
      { 
       //do what you want 
      } 
     } 
+1

В этом случае вам также нужно будет использовать 'control' как' TextBox'. Возможно, лучше будет отличить сначала «управление как текстовое поле» и выполнить нулевую проверку. Таким образом, вы бросаете только один раз. –

0

Перед тем, как тратить (отходы) время написание кода для работы с базой данных разработаны таким образом, вы должны изменить дизайн вашей базы данных. Не стоит иметь 10 столбцов в таблице для 10 адресов. У вас должно быть место от 0 до бесконечности. Посмотрите, как создать реляционную базу данных.

В основном:

Таблица: Клиент

CustomerID 
Name 
Etc. 

Таблица: CustomerAddresses

CustomerID 
Address 
City 
State 
Zip 
0

Шаг1: вы можете пройти через все Form кон троллей и учтите только элементы управления TextBox.

Шаг 2: от всех форм TextBox управления фильтровать TextBox-х, которые содержат Name как "txt_Address%" здесь % canbe ничего подобного 1,2,3,4 ... и т.д.,

код как. ниже:

 List<String> txtValues=new List<string>(); 
     foreach (var control in this.Controls) 
     { 
     if((control is TextBox) && (((TextBox) control).Name.Contains("txt_Address"))) 
      txtValues.Add(((TextBox) control).Text.ToString()); 
     } 
0

Вы можете использовать Controls.Find(), как это:

 for (int i = 1; i <= 10; i++) 
     { 
      Control[] matches = this.Controls.Find("txt_Address" + i.ToString(), true); 
      if (matches.Length > 0 && matches[0] is TextBox) 
      { 
       TextBox tb = (TextBox)matches[0]; 
       // ... do something with "tb" ... 
      } 
     } 
+0

Нужно ли добавить пространство имен для Controls.Find()? Если да, то пожалуйста, скажите мне. Потому что я не могу найти метод Find в intellicense. –

+0

Вы не указали ... WinForms ?, WebForms ?, WPF ?, что-то еще? –

+0

Я говорю о WebForms. –

0
var columns = new Dictionary<string, string>(); 
for (int i = 1; i <= 10; i++) columns.Add("Address" + i, string.Empty); 

var textBoxes = Controls.Find("txt_Address", true).Where(t => t is TextBox).ToList(); 

columns.ToList().ForEach(c => 
{ 
    var index = c.Key.Replace("Address", string.Empty); 
    var textBox = textBoxes.FirstOrDefault(t => index.Equals(t.Name.Replace("txt_Address", string.Empty))); 
    if (textBox != null) columns[c.Key] = textBox.Text; 
}); 
Смежные вопросы