2013-08-14 4 views
0

Я делаю проект для класса, но не могу понять эту маленькую точку, которая удерживает меня в ночи. Я создаю страницу динамически и создает панель для каждой записи в базе данных. Теперь проблема в том, что я использую одну кнопку для всех кнопок на каждой панели. Мне нужно знать, какая кнопка была нажата, поэтому я могу отправить CarID в сеансе на другую страницу.Создание элементов управления динамически

namespace SportBucks 
{ 
public partial class Auction : System.Web.UI.Page 
{ 
    string GCarID = ""; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     bool bWinnerID = false; 
     bool bWiningBet = false; 

     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     if ((string)Session["LoggedIn"] == null) 
     { 
      Response.Redirect("Default.aspx"); 
     } 
     else 
     { 
      Service s = new Service(); 
      int Total = s.CarsCount(); 
      for (int loop = Total; loop > 0; loop--) 
      { 
       Panel Panel1 = new Panel(); 
       Panel1.ID = "pnl" + loop.ToString(); 
       Panel1.Style["position"] = "absolute"; 
       Panel1.Style["left"] = "155px"; 
       Panel1.Style["top"] = "250px"; 
       Panel1.Style["Height"] = "200px"; 
       Panel1.Style["Width"] = "1000px"; 
       Panel1.BackColor = System.Drawing.Color.Black; 

       if (loop >= 2) 
       { 
        int Top = (250 * (loop - 1)); 
        Panel1.Style["top"] = (250 + Top + 20).ToString() + "px"; 
       } 
       form1.Controls.Add(Panel1); 
       string Details = s.LoadCars(loop); 
       if (Details != null) 
       { 
        string CarID = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(CarID + "|", ""); 
        string Man = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Man + "|", ""); 
        string Class = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Class + "|", ""); 
        string Type = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Type + "|", ""); 
        string Description = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Description + "|", ""); 
        string Reserve = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Reserve + "|", ""); 
        string Starting = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Starting + "|", ""); 
        string Begun = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(Begun + "|", ""); 
        Begun = Begun.Substring(0, Begun.IndexOf(" ")); 
        string End = Details.Substring(0, Details.IndexOf("|")); 
        Details = Details.Replace(End + "|", ""); 
        End = End.Substring(0, End.IndexOf(" ")); 
        string WinnerID = ""; 
        string WinningBet = ""; 
        if (Details.Substring(0, 1) == "|") 
        { 
         bWinnerID = false; 
         Details = Details.Substring(1); 
        } 
        else 
        { 
         WinnerID = Details.Substring(0, Details.IndexOf("|")); 
         Details = Details.Replace(WinnerID + "|", ""); 
         bWinnerID = true; 
        } 

        if (Details.Substring(0, 1) == "|") 
        { 
         Details = Details.Substring(1); 
         bWiningBet = false; 
        } 
        else 
        { 
         WinningBet = Details.Substring(0, Details.IndexOf("|")); 
         Details = Details.Replace(WinningBet + "|", ""); 
         bWiningBet = true; 
        } 

        string PicUrl = Details.Substring(0, Details.IndexOf("|")); 
        int Counter = PicUrl.Split(';').Length - 1; 
        if (Counter >= 1) 
        { 
         Image image1 = new Image(); 
         image1.ID = "img" + CarID; 
         image1.ImageAlign = ImageAlign.AbsMiddle; 
         image1.Visible = true; 
         string Pic1 = PicUrl.Substring(0, PicUrl.IndexOf(";")); 
         image1.ImageUrl = Pic1; 
         image1.Style["Left"] = "10px"; 
         image1.Style["position"] = "absolute"; 
         image1.Style["top"] = "10px"; 
         image1.Height = 180; 
         image1.Width = 230; 
         Panel1.Controls.Add(image1); 

        } 
        Label label1 = new Label(); 
        label1.ID = "lblDescription" + CarID; 
        label1.Text = Description; 
        label1.ForeColor = System.Drawing.Color.Lime; 
        label1.BorderStyle = BorderStyle.Groove; 
        label1.BorderColor = System.Drawing.Color.Violet; 
        label1.Style["Left"] = "500px"; 
        label1.Style["position"] = "absolute"; 
        label1.Style["top"] = "30px"; 
        Panel1.Controls.Add(label1); 

        Label label2 = new Label(); 
        label2.ID = "lblBegun" + CarID; 
        label2.Text = "Auction Start: " + Begun; 
        label2.ForeColor = System.Drawing.Color.Lime; 
        label2.Style["Left"] = "270px"; 
        label2.Style["position"] = "absolute"; 
        label2.Style["top"] = "30px"; 
        Panel1.Controls.Add(label2); 

        Label label3 = new Label(); 
        label3.ID = "lblEnd" + CarID; 
        label3.Text = "Auction End: " + End; 
        label3.ForeColor = System.Drawing.Color.Lime; 
        label3.Style["Left"] = "270px"; 
        label3.Style["position"] = "absolute"; 
        label3.Style["top"] = "50px"; 
        Panel1.Controls.Add(label3); 

        Label label4 = new Label(); 
        label4.ID = "lblReserve" + CarID; 
        label4.Text = "Reserve: " + Reserve; 
        label4.ForeColor = System.Drawing.Color.Lime; 
        label4.Style["Left"] = "270px"; 
        label4.Style["position"] = "absolute"; 
        label4.Style["top"] = "70px"; 
        Panel1.Controls.Add(label4); 

        Label label5 = new Label(); 
        label5.ID = "lblMan" + CarID; 
        label5.Text = "Manufacturer: " + Man; 
        label5.ForeColor = System.Drawing.Color.Lime; 
        label5.Style["Left"] = "270px"; 
        label5.Style["position"] = "absolute"; 
        label5.Style["top"] = "90px"; 
        Panel1.Controls.Add(label5); 

        Label label6 = new Label(); 
        label6.ID = "lblClass" + CarID; 
        label6.Text = "Class: " + Class; 
        label6.ForeColor = System.Drawing.Color.Lime; 
        label6.Style["Left"] = "270px"; 
        label6.Style["position"] = "absolute"; 
        label6.Style["top"] = "110px"; 
        Panel1.Controls.Add(label6); 

        Label label7 = new Label(); 
        label7.ID = "lblType" + CarID; 
        label7.Text = "Type: " + Type; 
        label7.ForeColor = System.Drawing.Color.Lime; 
        label7.Style["Left"] = "270px"; 
        label7.Style["position"] = "absolute"; 
        label7.Style["top"] = "130px"; 
        Panel1.Controls.Add(label7); 

        if (bWinnerID == true) 
        { 
         Label label8 = new Label(); 
         label8.ID = "lblWinnerID" + CarID; 
         label8.Text = "WinnerID: " + WinnerID; 
         label8.ForeColor = System.Drawing.Color.Lime; 
         label8.Style["Left"] = "270px"; 
         label8.Style["position"] = "absolute"; 
         label8.Style["top"] = "130px"; 
         Panel1.Controls.Add(label8); 
        } 
        if (bWiningBet == true) 
        { 
         Label label9 = new Label(); 
         label9.ID = "lblWinningBet" + CarID; 
         label9.Text = "WinningBet R: " + WinningBet; 
         label9.ForeColor = System.Drawing.Color.Lime; 
         label9.Style["Left"] = "270px"; 
         label9.Style["position"] = "absolute"; 
         label9.Style["top"] = "130px"; 
         Panel1.Controls.Add(label9); 
        } 

        /*int View = s.TimesView(CarID); 
        Label label10 = new Label(); 
        label10.ID = "lblView" + CarID; 
        label10.Text = "Times View: " + View; 
        label10.ForeColor = System.Drawing.Color.Lime; 
        label10.Style["Left"] = "1000px"; 
        label10.Style["position"] = "absolute"; 
        label10.Style["top"] = "130px"; 
        Panel1.Controls.Add(label10);*/ 

        Button btnView = new Button(); 
        btnView.ID = CarID; 
        btnView.Text = "View Car"; 
        btnView.ForeColor = System.Drawing.Color.DeepSkyBlue; 
        btnView.BackColor = System.Drawing.Color.Gray; 
        btnView.BorderColor = System.Drawing.Color.Violet; 
        btnView.Style["top"] = "110px"; 
        btnView.Style["left"] = "800px"; 
        btnView.Style["Height"] = "20px"; 
        btnView.Style["position"] = "absolute"; 
        btnView.BorderStyle = BorderStyle.Outset; 
        btnView.Click += new EventHandler(this.btnView_Click); 
        GCarID = CarID; 
        Panel1.Controls.Add(btnView); 
       } 
      } 
     } 
    } 

      void btnView_Click(object sender, EventArgs e) 
      { 
       Session["CarID"] = GCarID; 
       Response.Redirect("View.aspx"); 
      } 

}} 
+0

Вы используете одну кнопку для всех кнопок? Пожалуйста, уточните –

+4

Вы можете использовать 'Repeater', а не динамически создавать элементы управления. Это позволит вам создать шаблон, а затем просто привязать данные, которые у вас есть к этому шаблону. С этим работать гораздо проще. – Servy

+0

@MrJones Он использует один и тот же обработчик событий для всех кнопок. – Servy

ответ

0

Вы хотите использовать Command Button событие с CommandArgument вместо Click события.

CommandArgument предназначен для такого рода аргументов хранения и возвращает его обратно в прошлое.

Button btnView = new Button(); 
btnView.ID = CarID; 
btnView.Text = "View Car"; 
btnView.ForeColor = System.Drawing.Color.DeepSkyBlue; 
btnView.BackColor = System.Drawing.Color.Gray; 
btnView.BorderColor = System.Drawing.Color.Violet; 
btnView.Style["top"] = "110px"; 
btnView.Style["left"] = "800px"; 
btnView.Style["Height"] = "20px"; 
btnView.Style["position"] = "absolute"; 
btnView.BorderStyle = BorderStyle.Outset; 
btnView.Command += btnView_Command; // Note: Command event is used instead of Click. 
btnView.CommandArgument = CarID; // Note: CarID is stored in CommandArgument. 
Panel1.Controls.Add(btnView); 

void btnView_Command(object sender, CommandEventArgs e) 
{ 
    string carID = e.CommandArgument.ToString(); 
    Session["CarID"] = carID; 
    Response.Redirect("View.aspx"); 
} 
0

В чем проблема? В обработчике события btnView_Click (отправитель объекта, EventArgs e) отправителем будет кнопка, которая была нажата. Просто отправьте отправителя на Control или Button => (отправитель в качестве элемента управления) или (отправитель как кнопка) и извлеките carID из свойства ID .. (который вы установили при загрузке страницы) - btnView.ID = CarID;

Это, конечно, предполагающей ваша страница ViewState работает нормально :) - что может быть сложно с динамически добавляемых элементов управления в ASP.NET

+0

Это дает ему объект 'Button', но не данные, которые он имеет логически связанных с ним. – Servy

+0

@Servy - Какие еще «логически связанные» данные ему нужны? Все, что он хочет, это carID, который он задал как идентификатор на кнопке (-ах). То, что он может получить. – Vivek

1

Попробуйте добавить атрибут пользовательских HTML.

// код позади:

Button btnView = new Button(); 
btnView.ID = CarID; 
//here 
btnView.Attributes.Add("GCarID", CarID); 
btnView.Text = "View Car"; 
btnView.ForeColor = System.Drawing.Color.DeepSkyBlue; 
btnView.BackColor = System.Drawing.Color.Gray; 
btnView.BorderColor = System.Drawing.Color.Violet; 
btnView.Style["top"] = "110px"; 
btnView.Style["left"] = "800px"; 
btnView.Style["Height"] = "20px"; 
btnView.Style["position"] = "absolute"; 
btnView.BorderStyle = BorderStyle.Outset; 
btnView.Click += new EventHandler(this.btnView_Click); 

//click 
void btnView_Click(object sender, EventArgs e) 
{ 
    Session["CarID"] = ((Button)sender).Attributes["GCarID"]; 
    Response.Redirect("View.aspx"); 
} 
1

Вам необходимо понять ASP.NET Life Cycle. Ваши динамические элементы управления должны быть созданы на этапе Page_Init(), а не Page_Load().

Что происходит, вы создаете элементы управления в Page_Load, и когда вы нажимаете кнопку и появляется сообщение, ваши динамические элементы управления уничтожаются. Элемент представления для элементов управления создается после Page_Init, но перед страницей Page_Load. Поэтому ваш элемент управления, который вы создаете динамически, не сохраняет свои значения (например, идентификатор).

Отъезд this page и this page для базового понимания того, о чем я говорю.

+0

Вы также можете создать динамический контроль в Page_Load, если вы действительно не хотите манипулировать ViewState. OP не использует ViewState, поэтому в Page_Load должно быть хорошо. *** Примечание. Когда вы создаете динамические элементы управления в веб-форме, вы должны создать элементы управления и добавить их в коллекцию элементов управления как в обработчике событий Page_Init, так и в обработчике событий Page_Load. В противном случае элементы управления могут работать не так, как ожидалось. *** [КАК: динамически создавать элементы управления в ASP.NET] (http://support.microsoft.com/kb/317515) – Win

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