2017-03-02 3 views
2

나는 백엔드에 많은 버튼을 만들어서 코드 줄을 줄이기 위해 그것을 추상화하는 것이 현명 할 것이라고 생각했다. 그러나이 작업을 시도 할 때 "local 또는 parameter"buttonName "이라는 로컬 또는 매개 변수는이 범위에서 선언 할 수 없습니다.이 이름은 로컬 또는 매개 변수를 정의하는 데 사용하는 내부 범위에서 사용됩니다." 내가 여기서 뭔가를 놓치고 있니? 나는 이것이이 상황에서 매개 변수를 사용하는 정확한 이유라고 생각했다.왜 내 버튼의 이름을 지정하는 데 매개 변수 문자열을 사용할 수 없습니까?

다음은 내가하려는 일의 예입니다.

차례

void CreateButton(string buttonName, string buttonIDText, string buttonText, PlaceHolder PlaceHolderName, string methodCall) 
{ 
    Button buttonName = new Button(); 
    buttonName.ID = buttonIDText; 
    buttonName.Text = buttonText; 
    buttonName.UseSubmitBehavior = false; 
    buttonName.Click += new EventHandler(methodCall); 
    PlaceHolderName.Controls.Add(buttonName); 
} 

는 methodCall을 부분은 여기에서 오류가 발생합니다 (이전 코드 대신에 메소드 호출 포함)이 속으로이

Button buttonDetailsEdit = new Button(); 
buttonDetailsEdit.ID = "ButtonDetailsEdit"; 
buttonDetailsEdit.Text = "Edit"; 
buttonDetailsEdit.UseSubmitBehavior = false; 
buttonDetailsEdit.Click += new EventHandler(EditCall); 
PlaceHolderDetailsContent.Controls.Add(buttonDetailsEdit); 

Button buttonDetailsBack = new Button(); 
buttonDetailsBack.ID = "ButtonDetailsBack"; 
buttonDetailsBack.Text = "Back to List"; 
buttonDetailsBack.UseSubmitBehavior = false; 
buttonDetailsBack.Click += new EventHandler(IndexCall); 
PlaceHolderDetailsContent.Controls.Add(buttonDetailsBack); 

, 나는 "때문에 믿고있어 methodCall "이이 인스턴스에 없습니다.

+0

당신의 작업 코드에서'IndexCall'의 유형 봐 ... – Habib

+0

"는 methodCall을 부분은 여기에서 오류가 발생합니다"- 그래서 오류가 무엇입니까? 동일한 오류 또는 다른 오류? –

+0

어쨌든 왜 'Button' 로컬 변수'buttonName'을 호출 했습니까? 확실히 '버튼'은 문제를 피할뿐만 아니라 더 적절할 것입니다. 컴파일러 오류 메시지가 어떤 식으로 여기에 있는지 확실하지 않습니다 ... 정확히 무엇이 잘못되었는지를 알려줍니다. –

답변

7

string buttonNameButton buttonName은 같은 범위에 같은 이름의 변수를 사용할 수 없습니다.

시도는, 예를 들어, Button newButton

+2

변수 이름을'Button' 클래스의'Name' 속성과 혼동하는 것입니다. –

+0

아, 이제 이해합니다. 이미 매개 변수에서 선언되었으므로 메서드 내에서 선언 할 필요가 없습니다. 맞습니까? 그래서 Button 부분을 삭제하고 buttonName = new Button(); – Nick

+0

귀하의 사전 편집 된 답변이 더 좋았다고 생각합니다. 이것은 여전히 ​​2 라인을 요구할 것입니다, 나는 그것을 호출 할 때 생각합니다. 하나는 버튼을 선언하고 다른 하나는 그것을 호출하는 것입니다. 그래서 다음과 같이 보일 것입니다. Button buttonBack = new Button(); CreateButton (buttonBack, "buttonBackId", "목록으로 돌아 가기", ​​TBNewDescrip, IndexCall); – Nick

2

라는 이름의 매개 변수 buttonName 선언하기 위해 버튼을 이름을 바꾸려면 :

string buttonName 

그리고를 같은 이름의 Button 변수를 선언 한 :

Button buttonName 

둘 다 가질 수 없습니다. 이것은 컴파일러가 불평하는 것입니다. 이제


, 실제로, 문제는 지역 변수 이름으로 매개 변수의 내용를 사용하려는 것으로 보인다. 이것은 일반적으로 불가능합니다. 런타임에뿐만 아니라 컴파일 타임에 변수 이름을 알아야합니다.

운 좋게도 실제로는 필요하지 않습니다. 메소드 내에서 Button 변수가 불려도 문제가되지 않습니다. 메서드가 끝나면 변수 이름이 손실 될 수 있습니다 (실제로는 컴파일을 통해 컴파일하지 못할 수도 있습니다).). 중요한 부분은 메서드를 호출 할 때마다 새 Button인스턴스이 생성되어 궁극적으로 목록에 추가된다는 것입니다.

따라서 변수의 이름을 newButton으로 바꾸고 더 이상 사용하지 않기 때문에 buttonName 매개 변수를 삭제하십시오.

-1

buttonName 변수 이름이 다시 사용되고 methodCall 유형이 잘못되었습니다. 선택한 함수를 메서드에 전달하려면 대리자 매개 변수가 필요합니다.

void CreateButton(string buttonName, 
        string buttonIDText, 
        string buttonText, 
        PlaceHolder placeHolder, 
        EventHandler methodCall) // needed to fix your type 
{ 
    var button = new Button(); //reused variable name 
    button.ID = buttonIDText; 
    button.Name = buttonName; //you missed assigning the button name 
    button.Text = buttonText; 
    button.UseSubmitBehavior = false; 
    button.Click += methodCall; // you dont need to do new EventHandler 
    placeHolder.Controls.Add(button); 
} 
+1

이것은 문제를 해결하거나 오류를 제거하지 않으며 아무 것도 설명하지 않습니다. –

+0

이것은 대리인으로 문자열을 전달하려고 시도 할 때 그의 오류를 수정합니다. –

+0

@MatthewWhited : 이는 OP가 게시 한 코드의 오류 중 하나입니다. 그러나 질문에서 주로 묻는 오류는 아닙니다 제목 당). –

관련 문제