2014-11-22 7 views
0

Name 속성이 있고 ToString() 속성을 다시 사용하여 ListBoxItem을 만들었습니다. 그것은 새로운 항목을 추가 할 때 멋지게 작동합니다.ListBox에서 항목 업데이트 강제 적용

하지만 이제는 선박 이름을 변경할 때 ListBox에 라벨을 업데이트해야합니다. 새로 고침이나 업데이트로 그렇게 할 수 있다고 생각했지만 작동하지 않습니다.

나는 여기에서 아주 쉽게 뭔가를 놓칠 수 있습니다.

public class ShipListBoxItem 
{ 
    public ListBox Parent { get; set; } 

    public ShipType Ship { get; set; } 

    public ShipListBoxItem() 
    { 
     Ship = new ShipType(); 
    } 

    public ShipListBoxItem(ShipType st) 
    { 
     Ship = st; 
    } 

    public override string ToString() 
    { 
     return Ship.Name; 
    } 

    public void UpdateListBox() 
    { 
     Parent.Refresh(); //My problem is here. Update doesn't work either. 
    } 

    public static ShipListBoxItem AddToListBox(ListBox lb, ShipType ship) 
    { 
     ShipListBoxItem li = new ShipListBoxItem(ship); 

     li.Parent = lb; 

     lb.Items.Add(li); 

     return li; 
    } 
} 
+0

과 같은 OnSelectedIndexChanged을 트리거합니다. 추가 된 항목을 표시하려면 새로 고칠 필요가 없습니다. 나는 이것을 다음과 같이 불렀다 : ShipType s1 = new ShipType(); s1.Name = textBox1.Text; ShipListBoxItem.AddToListBox (this.listBox1, s1); – NoChance

+0

수정하지 않고 항목을 추가해도 문제가 없습니다. – user2888973

+0

UpdateListBox()는 인수를 사용하지 않고 어떻게 업데이트합니까? – NoChance

답변

1

ListBox.RefreshItems() 

msdn

편집을보십시오 :이 같은 확장 된 클래스를 사용할 수 있습니다 :

public class FooLisBox : System.Windows.Forms.ListBox 
{ 
    public void RefreshAllItems() 
    { 
     RefreshItems(); 
    } 
} 


private void button1_Click(object sender, EventArgs e) 
{ 
    (listBox1.Items[0] as ShipListBoxItem).Ship.Name = "AAAA"; 
    listBox1.RefreshAllItems(); 
} 
+0

나는 네 길을 갔다. 나중의 게시물에 전체 코드를 게시 할 때 순환 코드 문제가 발생하지 않고 선택된 항목이 선택되어 있는지 확인하기위한 코드를 다림질했습니다. – user2888973

1

당신이 목록 상자의 DataSourceList<T>를 사용하는 경우 항목을 변경하는 것은 꽤 쉽습니다. 그것은 또한 목록 상자에 ShipListBoxItem를 추가하기위한 특별 클래스가 할 진짜 이유가 없다는 것을 의미, 기본적인 Ship 클래스는 작동 할 수 있습니다

class ShipItem 
{ 
    public enum ShipTypes { BattleShip, Carrier, Destroyer, Submarine, Frigate }; 

    public ShipTypes Ship { get; set; } 
    public string Name { get; set; } 

    public ShipItem(string n, ShipTypes st) 
    { 
     Name = n; 
     Ship = st; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0}: {1}", Ship.ToString(), Name); 
    } 
} 

양식과 관련된 것들 :

private void Form1_Load(object sender, EventArgs e) 
{ 
    // add some ships 
    Ships = new List<ShipItem>(); 
    Ships.Add(new ShipItem("USS Missouri", ShipTypes.BattleShip)); 
    Ships.Add(new ShipItem("USS Ronald Reagan", ShipTypes.Carrier)); 
    lb.DataSource = Ships; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    // change a ship name 
    lb.DataSource = null;   // suspend binding 
    this.Ships[0].Name = "USS Iowa"; 
    lb.DataSource = Ships;   // rebind 
    lb.Refresh(); 
} 

을 대안으로 , 당신은 또한 DisplayMember를 사용하여 디스플레이에 대한 특정 속성을 사용하는 목록 상자를 알 수 있습니다 :

lb.DataSource = Ships; 
lb.DisplayMember = "Name"; 

이 이름 페이지를 사용합니다 목록 상자에 roperty 대신 ToString 메서드를 사용하십시오. 목록이 많이 변경되는 경우 대신 BindingList을 사용하십시오. DataSource를 토글하지 않고 목록 상자에 추가 할 때 ListBox에 표시되는 목록을 변경할 수 있습니다.

+0

나중에 참조하기이 작품은 전문가가 아닌 것처럼 보였지만 (저에게 추악한) 나에게. – user2888973

+0

데이터 소스를 토글하는 것은 고통스럽기 때문에 BindingList를 언급했다. 가치있는 것인지의 여부는 기본 데이터가 얼마나 동적인지에 달려 있습니다. – Plutonix

+0

LINQ를 통해 내 데이터를 가져와야합니다. 내부적으로 내 데이터는 파생 된 사전 입니다. 이 방법으로 문제가 내 목록 업데이 트를 시각적으로 3 번입니다 ..파생 된 listboxClass를 사용하면 훨씬 더 많은 제어가 가능하며 (장기적으로) 유지 관리가 가능합니다. – user2888973

0

나는 내 문제를 해결할 수있었습니다.

대부분, 감사 호세 M.

나는 그러나 문제 다 퉜다. RefreshItems는() 나는 그것을 테스트 할 때 귀하의 코드가 작동()

그래서 내 오버라이드 (override) 클래스는이

public class MyListBox : ListBox 
{ 
    public bool DoEvents{ get; set; } // Made it public so in the future I can block event triggering externally 

    public MyListBox() 
    { 
     DoEvents = true; 
    } 

    public void RefreshAllItems() 
    { 
     SuspendLayout(); 
     DoEvents = false; 
     base.RefreshItems(); // this triggers OnSelectedIndexChanged as it selects the selected item again 
     DoEvents = true; 
     ResumeLayout(); 
    } 

    // I only use this event but you can add all events you need to block 
    protected override void OnSelectedIndexChanged(EventArgs e) 
    { 
     if (DoEvents) 
      base.OnSelectedIndexChanged(e); 
    } 
}