Hej. Titta på DataSource egenskapen. Testade med Du har rätt, naturligtvis ska det vara "theList.DataSource = lagringsklass.getList();" och det kan du ju skriva efter det att du gjort din "lagringsklass.add(element);" ser inte att som det funkar med att köra Ok om du gör så här i stället, är det OK.Uppdatera ListBox
Har en lagrings klass som innehåller en List.
den har bla. metoderna:
public List getList(){
return theList;
}
public void addItem(string newString){
theList.Add(newString);
}
Sen har jag en klass med en form med en ListBox. För att lägga till saker till min ListBox använder jag en knapp som anropar addItem i lagringsklassen. Men hur gör jag för att uppdatera listan sen. Vet att man i java kunde använda
theList.setListData(lagringsklass.getList())
Fått det att funka med följande kod men blir rätt många ställen att ha den på. Borde finnas nåt smidigare sätt.
Lagringsklass rec = (Lagringsklass)recipeBox.SelectedItem;
List<string> descList = rec.getList();
foreach (string s in descList)
{
descListBox.Items.Add(s);
}
Sv: Uppdatera ListBox
t ex. theList.DataSource(lagringsklass.getList())Sv:Uppdatera ListBox
theList.DataSource = lagringsklass.getList();
och för metoden som hanterar knapptryckning för lägg till knappen ändra jag till
lagringsklass.add(element);
Men vad sriver jag för att uppdatera listboxen?
Sv: Uppdatera ListBox
Du kanske skulle skapa ett event i din lagringsklass som fyras av när listan ändras, add(element), delete(element) mm.
Sen kan du ju låta ditt formulär "lyssna" på händelsen och när den inträffar kör du theList.DataSource = lagringsklass.getList().
Ett exempel från MSDN
<code>
namespace TestCollections
{
// A delegate type for hooking up change notifications.
public delegate void ChangedEventHandler(object sender, System.EventArgs e);
// A class that works just like ArrayList, but sends event
// notifications whenever the list changes.
public class ListWithChangedEvent : System.Collections.ArrayList
{
// An event that clients can use to be notified whenever the
// elements of the list change.
public event ChangedEventHandler Changed;
// Invoke the Changed event; called whenever list changes
protected virtual void OnChanged(System.EventArgs e)
{
if (Changed != null)
{
Changed(this, e);
}
}
// Override some of the methods that can change the list;
// invoke event after each
public override int Add(object value)
{
int i = base.Add(value);
OnChanged(System.EventArgs.Empty);
return i;
}
public override void Clear()
{
base.Clear();
OnChanged(System.EventArgs.Empty);
}
public override object this[int index]
{
set
{
base[index] = value;
OnChanged(System.EventArgs.Empty);
}
}
}
}
namespace TestEvents
{
using TestCollections;
class EventListener
{
private ListWithChangedEvent m_list;
public EventListener(ListWithChangedEvent list)
{
m_list = list;
// Add "ListChanged" to the Changed event on m_list:
m_list.Changed += new ChangedEventHandler(ListChanged);
}
// This will be called whenever the list changes.
private void ListChanged(object sender, System.EventArgs e)
{
System.Console.WriteLine("This is called when the event fires.");
}
public void Detach()
{
// Detach the event and delete the list
m_list.Changed -= new ChangedEventHandler(ListChanged);
m_list = null;
}
}
class Test
{
// Test the ListWithChangedEvent class.
static void Main()
{
// Create a new list.
ListWithChangedEvent list = new ListWithChangedEvent();
// Create a class that listens to the list's change event.
EventListener listener = new EventListener(list);
// Add and remove items from the list.
list.Add("item 1");
list.Clear();
listener.Detach();
}
}
}
</code>Sv: Uppdatera ListBox
theList.DataSource = lagringsklass.getList();
igen. Inget hände när jag gjorde så.
men testade
theList.DataSource = null;
theList.DataSource = lagringsklass.getList();
och då uppdaterades listan. Känns inte som rätt metod, men funkar...Sv:Uppdatera ListBox
Jag har använt BindingList<String> istället för List<String>.
Lagringsklassen.
<code>
using System;
using System.Text;
using System.ComponentModel;
namespace WindowsApplication2
{
class Lagringsklass
{
BindingList<string> theList;
public Lagringsklass()
{
theList = new BindingList<string>();
}
public BindingList<string> getList()
{
return theList;
}
public void addItem(string newString)
{
theList.Add(newString);
}
public void DeleteItem(string deleteString)
{
theList.Remove(deleteString);
}
}
}
</code>
Window Form
<code>
using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
private Lagringsklass lagringsklass;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
lagringsklass = new Lagringsklass();
listBox1.DataSource = lagringsklass.getList();
listBox1.Sorted = true;
//Laddar data utgångsdata för test
lagringsklass.addItem("Item1");
lagringsklass.addItem("Item2");
lagringsklass.addItem("Item3");
}
//Add item
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length > 0)
{
lagringsklass.addItem(textBox1.Text);
}
}
//Delete Item
private void button2_Click(object sender, EventArgs e)
{
if(listBox1.SelectedIndex >= 0)
lagringsklass.DeleteItem(listBox1.SelectedValue.ToString());
}
}
}
</code>