2012-12-13 6 views
2

목록으로 작업하고 있습니다. 내 목록에서 항목의 첫 번째와 마지막 위치를 결정할 수있었습니다. 을 사용하고 Label을 통해 항목 이름을 표시하고 있습니다. 내 양식의 버튼 세 개 : ShowFirstItemShowNextItem (작동하지 않음) 및 ShowLastItem은 라벨에 해당 항목을 표시합니다. 다음 항목에 문제가 있습니다. 회원 번호가 현재 fruit_tree 인 회원이 없습니다. 따라서 int 회원 또는 current 회원 인 다른 fruit_tree 회원을 추가하는 방법을 모르겠습니다. 어떻게하면 다음 항목 (첫 번째 항목 이후)을 찾고 결과를 표시 할 수 있습니까?목록에서 현재 가리키는 항목 확인

public class ListForTrees 
{ 

     public fruit_trees GetNextTree() 
      { 
       current = 0; 
       fruit_trees ft = first_tree; 
       int i = 0; 
       while (i != current) 
       { 
        ft = ft.next_tree; 
        i++; 

       } 

       return ft; 
      } 

      } 

      ListForTrees mainlist = new ListForTrees();  

      private void BtnGo_Click(object sender, EventArgs e) 
      { 
       fruit_trees[] ar_items = { new fruit_trees("cherry", 48, 12.95, 3), 
               new fruit_trees("pine", 36, 9.95, 8), 
               new fruit_trees("oak", 60, 14.95, 2), 
               new fruit_trees("peach", 54, 19.95, 3), 
               new fruit_trees("pear", 36, 11.85, 2), 
               new fruit_trees("apple", 62, 13.45, 5) 
              }; 
       mainlist = new ListForTrees(ar_items); 
       fruit_trees current = mainlist.first_tree; 

       while (current != null) 
       { 
        TxtOutput.AppendText(current.ToString() + Environment.NewLine); 
        current = current.next_tree; 
       } 
      } 


      private void ShowFirstItem_Click_1(object sender, EventArgs e) 
      { 
      // Show First Item 
     labelSpecificTree.Text = mainlist.first_tree.GetTreeType; 

      } 

      private void ShowLastItem_Click(object sender, EventArgs e) 
      { 
      //Show Last Item 
     labelSpecificTree.Text = mainlist.last_tree.GetTreeType; 
      } 

     private void ShowNextItem_Click(object sender, EventArgs e) 
      { 
      //Show Next Item 
fruit_trees obj = mainlist.GetNextTree(); 

      if (obj == null) 
      { 
       labelSpecificTree.Text = "No more trees!"; 
      } 
      else 
      { 
       mainlist.current++; 
       labelSpecificTree.Text = obj.next_tree.GetTreeType.ToString();     
      } 
      } 



     } 

답변

1

나는 listoftrees에

public int current; 

을 추가합니다. 생성자에서 0으로 설정하십시오.

그런 다음 현재 fruit_trees가

public fruit_trees getCurrent() 
{ 
    fruit_trees ft = first_tree; 
    int i = 0; 
    while(i != current) 
    { 
     ft = ft.next_tree; 
     i++; 
    } 
    return ft; 
} 

지금이 메소드는 다음 개체의 현재와하지를 반환 개체를 반환하는 방법을 만들 수 있습니다. 따라서 다음 버튼 이벤트에는 두 가지 옵션이 있습니다.
여기 단추를 클릭 할 때마다 다음 트리 개체로 이동 하시겠습니까? 이 경우 현재 등록 정보를 증가시킨 다음 getcurrent를 호출하여 표시합니다. 현재를 유지하고 이동하지 않으려는 경우 (예 : 다음을 계속 반복해서 클릭하면 같은 결과가 발생 함) 그러면 getcurrent(). next_tree.tree_type이 현재까지 증가하지 않습니다. 이 문제가 해결되는지

+0

네, 좋은 :

if (count == 0) { ... } else if (count != 0) { ... } 

가로 변경 될 수 있습니다. 목록의 다음 트리 객체로 이동하려고합니다. 버튼 클릭에서'current ++'를 증가시켜야합니까? 또는 정확히 어떻게 할 것인가? – CodingWonders90

+1

mainlist.current ++; 그 다음에 getCurrent()를 호출하면 다음 tree_object가 생깁니다. –

+0

좋아요, 증가 된 mainlist.current ++를 추가 한 다음 버튼 내에서 getCurrent (이 경우 GetNextTree로 변경)를 호출했지만 나는 처음으로 하나의 나무 만 얻고 다른 것은 얻지 못한다. 새로운 변경 사항에 대한 코드를 편집했습니다. 제 질문을 확인해주세요. – CodingWonders90

2

는 잘 모르겠지만, 당신은 ListForTrees 클래스

public fruit_trees current_tree; 

필드를 추가 할 수 있습니다.

그러면 다음에 항목 포인터를 이동하는 방법을 목록에있는 다음 항목으로 쉽게 추가 할 수 있습니다. 현재 항목을 기억하면 목록에서 다음 트리를 원할 때마다 전체 목록을 탐색하지 않아도됩니다. 코드는 다음과 같을 수 있습니다

public fruit_trees GetNextTree() 
{ 
    //save currently pointed tree 
    fruit_trees tree = this.current_tree; 
    if (tree != null) 
    { 
     //move current_tree to the next tree, to be returned next time 
     current_tree = current_tree.next_tree; 
     //return saved tree object 
    } 
    return tree; 
} 

작동하게하기 위해, 당신은 또한 목록에 추가 첫 번째 나무와 current_tree의 값을 시작하는 것을 기억해야한다. ResetNextTreePointer() 메서드를 작성하여 목록의 첫 번째 트리로 다시 가리킬 수도 있습니다.

코드에 좀 더 제안 :

  • 내가이 수업의 필드 속성을 사용하는 것이 더 좋을 것입니다 생각, 그래서 즉 변화

    public fruit_trees first_tree; 
    

    private fruit_trees first_tree; 
    public fruit_trees First_tree { get { return first_tree; } 
    

    으로 변경하면 클래스 외부의 모든 클래스가 해당 필드를 명시 적으로 수정할 수 없게됩니다.

  • 이 코드 :

    if (count == 0) 
    { 
        ... 
    } 
    else 
    { 
        ... 
    } 
    
+0

+1 This 거의 작동 중입니다. 어떻게'ShowNextItem' 버튼에서'GetNextTree'를 호출하여 레이블에 표시 할 수 있습니까? – CodingWonders90

+0

'labelSpecificTree.Text = mainlist.GetNex tTree();'를 클릭하면 각 클릭의 목록에서 다음 트리를 표시합니다. –

+0

그런 식으로 시도했지만 오류가 발생했습니다. '암시 적으로'TreeFarm.Form1.fruit_trees '유형을'string''로 변환 할 수 없습니다. – CodingWonders90