2012-03-27 3 views
0

나는 RadioButtonList의 SelectedIndex를 OnSelectedIndexChanged 이벤트의 int 배열로 가져 가고 싶습니다. 나는 코드를 다음 시도했지만 작동하지 않습니다RadioButtonList.SelectedIndex를 Ints 배열로 가져 오는 방법?

는이 같은 배열을 만들 : 나는 .NET에서 온라인 테스트 시스템을 만들고있어

int[] correctAnswers = { -1, -1, -1, -1, -1 }; and i tried this as well:  
int[] correctAnswers = new int[100]; 

//SelectionChangeEvent  
protected void rbAnswers_SelectedIndexChanged(object sender, EventArgs e)  
{    
    int j = rbAnswers.SelectedIndex;     
    correctAnswers.SetValue(j, i); //or correctAnswers[i] = j;   
} 

. 나는 RadioButtonList의 라벨과 답변에서 질문을 바꾸고 있습니다. 값은 데이터베이스에서옵니다. 그리고 RadioButtonList를 동적으로 변경하려고합니다. 그러나 하나의 대답을 선택하고 다음 버튼을 클릭 한 다음 이전 버튼을 눌러 되돌아 가면 선택 항목이 사라집니다. 그래서 내가 선택한 인덱스를 int 배열에 저장하고 다음 및 이전 버튼에 해당 인덱스 값을 호출하고 RadioButtonList를 강타한 SelectedIndex에 배치하는 로직을 가지고 있습니다. 그래서 제발 나를 도와주세요. OnSelectionChange의 int 배열에서이 선택된 값을 취할 수 있습니까? 그리고 하나 더 추가하면 RadioButtonList의 Post Back True를 만듭니다.

+0

귀하의 질문은 혼란 스럽다. 선택 항목을 배열에 저장하려고합니까? 아니면 정답 배열로 선택 항목을 선택합니까? –

+0

그냥 배열에 저장하고 싶습니다. 비교가 필요 없음 –

답변

0

각 페이지를 인스턴스화 할 때 배열의 새 인스턴스를로드/posctback하는 문제가 발생한다고 생각합니다. 페이지로드가 발생하면 모든 페이지 변수가 종료됩니다. 따라서 버튼 클릭 이벤트가 발생할 때마다 다시 게시가 발생합니다. 페이지 클래스의 새 인스턴스가 만들어지고 모든 기본 필드도 인스턴스화됩니다.

분명히 중간 정도의 결과를 캐싱해야합니다. 소량의 데이터 (항목 배열이 거의 없음) 때문에 세션을 고려할 수 있습니다. 또한 배열 대신 generic List<>을 사용하는 것을 고려하십시오. 특히 boxing/unboxing을 발생시키는 값 유형을 저장할 때 고려하십시오.

class MyPage: Page 
{ 
    private IList<int> correctAnswers; 
    private readonly string cacheKey = "cachedResults"; 

    protected void Page_Load(object sender, EventARgs args) 
    { 
     this.LoadCache(); 
    } 

    protected void rbAnswers_SelectedIndexChanged(object sender, EventArgs e)  
    {    
     if (rbAnswers.SelectedIndex >= 0) 
     { 
      // TODO: ensure there are enough allocated items 
      // so indexer [] would not throw 
      correctAnswers[rbAnswers.SelectedIndex] = i; 
      this.SyncCache(); 
     } 
    } 

    private LoadCache() 
    { 
     var resultsCache = Session[this.cacheKey]; 
     if (resultsCache != null) 
     { 
      this.correctAnswers = resultsCache as List<int>; 
     } 
    } 

    private void SyncCache() 
    { 
     Session[this.cacheKey] = this.correctAnswers; 
    } 
} 
+0

안녕하세요 sll, 페이지로드 이벤트보다 높게 만들어서 페이지로드 변수로 계산합니까? 두 번째로 세션 아이디어가 두드러 지지만 모든 대답에 대해 어떻게 세션을 만들 수 있습니까? 또는 세션을 관리하는 다른 방법이 있습니까? 미안하지만 나는 닷넷과 그것의 연구소 프로젝트에서 새로운 사람이다. –

+0

업데이트 된 답변보기, 실용 주의적으로 모든 목록을 세션에 보관한다. 이것은 숫자 목록 (매우 큰 객체가 아님)에 적합하다. – sll

+0

@sll : 나는 당신의 노력에 감사한다. OP 코드를 재사용하려면 위의 코드에 몇 가지 명백한 오류가 있습니다. 그것을 컴파일 그래서 나는 upvote거야 그것을 고칠 수 있습니다. –

1

당신은 내가 당신이 무엇을 수집 할 수 있습니다, 당신이 "사용자의 여행"을 통해 값을 유지하는거야 방법을 고려해야 할 것입니다에서 동적으로 컨트롤을 채우는 경우. 단일 페이지에서 모든 것이 계산되는 경우 ViewState을 사용하여 정보를 유지할 수 있습니다. Control 내에서 같은 Page 또는 UserControl 당신은 할 수 있습니다 :

/// <summary> 
/// Gets or sets the answers to the view state 
/// </summary> 
private List<int> Answers 
{ 
    get 
    { 
     // attempt to load the answers from the view state 
     var viewStateAnswers = ViewState["Answers"]; 

     // if the answers are null, or not a list, create a new list and save to viewstate 
     if (viewStateAnswers == null || !(viewStateAnswers is List<int>)) 
     { 
      Answers = new List<int>(); 
     } 

     // return the answers list 
     return (List<int>)viewStateAnswers; 
    } 
    set 
    { 
     // saves a list to the view state 
     var viewStateAnswers = ViewState["Answers"]; 
    } 
} 
+0

+1 : 나는 이것이 최선의 해결책이라고 생각하지만,이 경우 세터가 필요하다고 생각하지 않습니다. –

+0

안녕하세요, 저는이 유형의 동적 관리를하고 있습니다. 다음 버튼의 항목을 지우고 데이터베이스에서 새 항목을로드합니다. 이것은 내가 역동적이라고 불렀던 것을 미안하다. –

관련 문제