2010-12-21 4 views
1

먼저 내 문제를 읽고 시간을내어 주신 데 대해 감사드립니다. :) 내 문제에 이제 단추가 메서드를 호출하지 않으려합니다 (ASP.NET - C#)

... 나는 C# 코드와 함께 새로운 버튼을 만들고에 Panel1라는 이름의 내 패널로 부착 해요 :

Button novgumb = new Button(); 
novgumb.Click += new EventHandler(ButtonOdstrani); 
novgumb.CommandArgument = "2"; 
novgumb.Visible = true; 
novgumb.Text = "Test"; 
Panel1.Controls.Add(novgumb); 

이렇게 만든 버튼, 내 메소드를 호출한다 ButtonOdstrani : 내가 PageLoad에 버튼 코드를 삽입 할 때

public void ButtonOdstrani(object sender, EventArgs e) 
    { 
     string asd = ((Button)sender).CommandArgument; 
     //... 
    } 

지금 그것을 잘 작동하지만이 사이트에서 XML을을 writting 내 방법 안에 넣어 때, 이러한 방법으로 생성 된 버튼을 사용하여 함수를 호출하지 않습니다 ButtonOdstrani :

protected void IzpisXML() 
    { 
     BranjeXML(); 
     string[] element = ime.Split('$'); 
     //Button gumbs = new Button(); 
     //gumbs.Click += new EventHandler(ButtonOdstrani); 
     //gumbs.Visible = true; 
     //gumbs.Text = ("Odstrani "); 
     //Panel1.Controls.Add(gumbs); 
     for (; z < stevec/2; z++) 
     {      
      string imeGostilne = element[i]; 
      string naslov = element[i + 1]; 
      string telefon = element[i + 2]; 
      string spletnaStran = element[i + 3]; 
      string odpiralniOD = element[i + 4]; 
      string odpiralniDO = element[i + 5]; 
      string boni = element[i + 6]; 

      Label labela = new Label(); 

      labela.Text = "<b>Ime gostilne:</b> " + imeGostilne + "<br /><b>Naslov:</b> " + naslov + "<br><b>Telefon:</b> " + telefon + "<br><b>Spletna stran:</b> " + spletnaStran + "<br><b>Odpiralni cas:</b> " + odpiralniOD + " - " + odpiralniDO + "<br /><b>Študnetski boni:</b> " + boni + "<br />"; 
      labela.Enabled = true; 
      labela.EnableTheming = true; 
      labela.EnableViewState = true; 
      labela.Visible = true; 
      labela.ID = ("Label" + (z + 1)); 
      Panel1.Controls.Add(labela); 

      Button novgumb = new Button(); 
      novgumb.Click += new EventHandler(ButtonOdstrani); 
      novgumb.CommandArgument = "2"; 
      novgumb.Visible = true; 
      novgumb.Text = "Test"; 
      Panel1.Controls.Add(novgumb); 

      Label hr = new Label(); 
      hr.Text = "<hr />"; 
      hr.Visible = true; 
      hr.Enabled = true; 
      hr.EnableTheming = true; 
      hr.EnableViewState = true; 
      Panel1.Controls.Add(hr); 
      i += 7; 

     } 
    } 

이제 for 문장 외부의 주석 처리 된 버튼을주의하십시오. "작동하지 않았다"는 것은 ButtonOdstrani라는 함수를 호출하지 않았다는 것입니다. 그냥 사이트 (PostBack)를 새로 고쳤습니다.

나는 조언 해결책에 대해 정말로 감사 할 것입니다.


OK, 이제 내가 만든 다음

private Button[] ButtonZaOdstranjevanje; 

    protected override void OnInit(EventArgs e) 
    { 
     ButtonZaOdstranjevanje = new Button[stevec/2]; 
     base.OnInit(e); 
     BranjeXML(); 

     for (int j=0; j < stevec/2; j++) 
     { 
      Button novgumb = new Button(); 
      novgumb.Click += new EventHandler(ButtonOdstrani); 
      novgumb.Visible = true; 
      novgumb.Text = "Odstrani gostilno"; 
      ButtonZaOdstranjevanje[j] = novgumb; 
     } 

    } 

그러나 문제는 내가 오류 얻을 수 있습니다 :이에 heppens "인덱스 배열의 범위를 벗어난를"

ButtonZaOdstranjevanje[j] = novgumb; 

stevec 값이 4/2 = 2 그래서 stevec 및 J 매개 변수가 사람이 어떻게이 오류를 수정하는 어떤 생각을 가지고 있습니까 0 으로 설정되어 있기 때문에 그것은 논리적이 아니다?

답변

5

동적 컨트롤을 만들 때 각 다시 게시에서 다시 만들어야합니다.

here

1

Ghosty,

동적 컨트롤 가장 페이지주기의 초기화 단계에서 생성 된 참조. 리차드가 언급했듯이 페이지에 올 때마다 게시해야합니다. Page_Init 이벤트 처리기 안에 코드를 넣고 기존 IsPostBack() 검사 바깥에 넣는 것이 좋습니다.

ASP.net 페이지 수명주기에 대한 자세한 내용은 here을 참조하십시오.

마이크

1

키 포인트 ASP.NET에서 동적 제어를 만들어 OnPreInit

2- 컨트롤해야

1- 컨트롤이 OnInit 생성되거나 더 좋은 재정의한다 있습니다 생성 될 때마다 동일한 ID로 생성됩니다.

위의 작업을 수행하면 필요한 모든 ASP.NET 배관이 처리됩니다. 포인트 1은 이것이 모든 페이지 요청/포스트 백에서 일어난다는 것을 보장 할 것이고, 포인트 2는 컨트롤 이벤트와 뷰 상태 등이 정확하게 맵핑되도록 보장한다.

0

이제는 작동 중입니다. OnInit 섹션에서 IzpisXML() 메서드를 호출했으며, 레이블 & 버튼을 표시/숨기기위한 Panel1 가시성을 변경했습니다. :

다시 한번 감사드립니다.:)

감사합니다!

관련 문제