2016-08-31 5 views
0

Мне кажется, что мой цикл foreach не достигает моей второй панели или что-то заставляет ее пропускать элементы в цикле.Цикл Foreach, не достигнув большего, чем первые элементы панели

Вот творящий панелей и петли (я знаю, что SQL уязвим для инъекций, но ради создания вопроса короче я использовал SQL):

Это то, что создается для каждого продукта продукт таблица:

Label lbName = new Label(); 
lbName.Text = name + "\n" + row[7].ToString(); 
lbName.Height = 40; 
lbName.Width = 150; 
lbName.Name = name + row[7].ToString(); 
lbName.Location = new Point(ptX, ptY); 
pt.Controls.Add(lbName); 

Label lbID = new Label(); 
lbID.Text = row[0].ToString(); 
lbID.Height = 40; 
lbID.Width = 150; 
lbID.Name = "ID" + name + row[7].ToString(); 
lbID.Location = new Point(ptX, ptY); 
lbID.Visible = false; 
pt.Controls.Add(lbID); 

TextBox txtStockCount = new TextBox(); 
txtStockCount.Text = "0"; 
txtStockCount.Height = 40; 
txtStockCount.Width = 100; 
txtStockCount.Name = "txtTS" + name + row[7].ToString(); 
txtStockCount.Location = new Point(ptX + 150, ptY); 
txtStockCount.GotFocus += txtStockCount_GotFocus; 
txtStockCount.KeyPress += txtStockCount_KeyPress; 
txtStockCount.LostFocus += txtStockCount_LostFocus; 
pt.Controls.Add(txtStockCount); 

TextBox txtBroken = new TextBox(); 
txtBroken.Text = "0"; 
txtBroken.Height = 40; 
txtBroken.Width = 100; 
txtBroken.Name = "txtTB" + name + row[7].ToString(); 
txtBroken.Location = new Point(ptX + 300, ptY); 
txtBroken.GotFocus += txtStockCount_GotFocus; 
txtBroken.KeyPress += txtStockCount_KeyPress; 
txtBroken.LostFocus += txtStockCount_LostFocus; 
pt.Controls.Add(txtBroken); 

TextBox txtRecieve = new TextBox(); 
txtRecieve.Text = "0"; 
txtRecieve.Height = 40; 
txtRecieve.Width = 100; 
txtRecieve.Name = "txtTR" + name + row[7].ToString(); 
txtRecieve.Location = new Point(ptX + 450, ptY); 
txtRecieve.GotFocus += txtStockCount_GotFocus; 
txtRecieve.KeyPress += txtStockCount_KeyPress; 
txtRecieve.LostFocus += txtStockCount_LostFocus; 
pt.Controls.Add(txtRecieve); 

Label lbDifference = new Label(); 
lbDifference.Text = " 0 "; 
lbDifference.Height = 40; 
lbDifference.Width = 150; 
lbDifference.Name = "lblDiff" + name + row[7].ToString(); 
        lbDifference.Location = new Point(ptX + 600, ptY); 
pt.Controls.Add(lbDifference); 

Button btnConfirm = new Button(); 
btnConfirm.Text = "Confirm"; 
btnConfirm.Height = 30; 
btnConfirm.Width = 80; 
btnConfirm.Name = "btnConfirm" + name + row[7].ToString(); 
        btnConfirm.Location = new Point(ptX + 750, ptY); 
        btnConfirm.Click += btnConfirm_Click; 
pt.Controls.Add(btnConfirm); 

и чтение панелей для обновления базы данных из текстовых полей:

private void txtStockCount_LostFocus(object sender, EventArgs e) 
{ 
     TextBox txtB = (sender as TextBox); 
     string name = txtB.Name.Remove(0,5); 
     string prodID = ""; 
     string QtyToday = ""; 
     string QtyBD = ""; 
     string QtyRev = ""; 
     string table = ""; 

     foreach (Panel p in pnls) 
     { 
      IEnumerable<Label> labels = p.Controls.OfType<Label>(); 
      foreach (Label label in labels) 
      { 
       string Compare = label.Name.Remove(0, 2); 
       if (name == Compare) 
       { 
        prodID = label.Text; 
        if (Regex.IsMatch(Compare, @"^[a-hA-H]")) 
        { 
         table = "ProductHistoryAH"; 
        } 
        else if (Regex.IsMatch(Compare, @"^[i-qI-Q]")) 
        { 
         table = "ProductHistoryIQ"; 
        } 
        else if (Regex.IsMatch(Compare, @"^[r-zR-Z]")) 
        { 
         table = "ProductHistoryRZ"; 
        } 
       } 
      } 

      string sql = "Select * From Product WHERE ProdID = '" + prodID + "'"; 
      DataTable dtP = db.GetDataTable(sql); 

      IEnumerable<TextBox> textBoxes = p.Controls.OfType<TextBox>(); 
      foreach (TextBox textBox in textBoxes) 
      { 
       string name1 = textBox.Name.Remove(0, 5); 
       label2.Text = name1; 
       if (name == name1) 
       { 
        if (textBox.Name == "txtTS" + dtP.Rows[0][1].ToString() + dtP.Rows[0][7].ToString()) 
        { 
         QtyToday = textBox.Text; 
        } 

        if (textBox.Name == "txtTB" + dtP.Rows[0][1].ToString() + dtP.Rows[0][7].ToString()) 
        { 
         QtyBD = textBox.Text; 
        } 

        if (textBox.Name == "txtTR" + dtP.Rows[0][1].ToString() + dtP.Rows[0][7].ToString()) 
        { 
         QtyRev = textBox.Text; 
        } 
       } 
      }     

      string sql1 = "Select * From " + table + " WHERE ProdID = '" + prodID + "' AND ProdHDate = '" + DateTime.Today.Date.ToShortDateString() + "'"; 
      DataTable dt = db.GetDataTable(sql1);     

      if (dt.Rows.Count == 0) 
      { 
       dbh.addnewstockhistory(ph); 

      } 
      else if (dt.Rows.Count > 0) 
      {      
       dbh.updatestockhistory(ph); 
      } 

     }    
} 

Все работает 100%, он вставляет и UPD с первой панелью, но никаких других текстовых полей на других панелях не работает.

Ошибка лежит в петле панели foreach, петли foreach внутри петли панели. Он говорит, что есть синтаксическая ошибка около строки строки sql1. Но я не понимаю, что это работает для первой панели, но не для других панелей, и у нее есть prodID. Я знаю, что это причина, по которой я поставил оператор на ярлыке, чтобы посмотреть, как он выглядит.

Пожалуйста, помогите. Попросите что-нибудь, если вам нужно.

+0

Мне нужен новый ноутбук :) – lordkain

+1

Это * огромное * количество кода. Уменьшите это до [mcve]. (Это действительно проблема Winforms? Можете ли вы воспроизвести ее в консольном приложении?) Какая из пяти циклов foreach в коде вызывает проблемы? –

+0

Извините, ребята, я сделаю это ... Дело в том, что я не знаю, где проблема: (... Но я постараюсь уменьшить код :) – Cleaven

ответ

0

Я думаю, что решил. Все, что мне нужно было сделать, это проверить, является ли панель панелью управления, проверяя, была ли панель родительскими кнопками, и это сработало.

if(p == btn.Parent) 
{ 
    //Do my stuff 
} 

в моей петле петли foreach.

 Смежные вопросы

  • Нет связанных вопросов^_^