it-swarm.asia

كيفية تحديث DataSource من ListBox

يحتوي النموذج على Combobox واحد و ListBox واحد. عند النقر فوق الزر "إضافة" ، أريد إضافة العنصر المحدد من مربع تحرير وسرد إلى مربع القائمة.

public partial class MyForm:Form
{
    List<MyData> data = new List<MyData>();
    private void ShowData()
    {
       listBox1.DataSource = data;
       listBox1.DisplayMember = "Name";
       listBox1.ValueMember = "Id";
    }

    private void buttonAddData_Click(object sender, EventArgs e)
    {
       var selection = (MyData)comboBox1.SelectedItem;
       data.Add(selection);
       ShowData();
    }
}

مع هذا المثال ، يتم استبدال العنصر المحدد بالتحديد الجديد داخل ListBox. أحتاج إلى إضافة العنصر إلى القائمة.

ماخطب الرمز خاصتي؟

43
panjo

listbox1.DataSource تبحث الخاصية عن تغييرات في القيمة ولكن عن طريق تعيين نفس القائمة طوال الوقت لن تتغير القيمة حقًا.

يمكنك استخدام BindingList<T> ، بدلاً من List<T> ، للتعرف تلقائيا على العناصر الجديدة المضافة. يجب استدعاء الأسلوب ShowData () مرة واحدة عند بدء التشغيل.

public partial class MyForm:Form
{
    public MyForm(){
        InitializeComponent();
        ShowData();
    }

    BindingList<MyData> data = new BindingList<MyData>();

    private void ShowData()
    {
       listBox1.DataSource = data;
       listBox1.DisplayMember = "Name";
       listBox1.ValueMember = "Id";
    }

    private void buttonAddData_Click(object sender, EventArgs e)
    {
       var selection = (MyData)comboBox1.SelectedItem;
       data.Add(selection);
    }
}
65
dwonisch

أود أن أقترح استخدام BindingSource لأنه سيؤدي إلى تحديث عناصر التحكم المتصلة بشكل صحيح.

public partial class MyForm : Form
{
    List<MyData> data = new List<MyData>();
    BindingSource bs = new BindingSource();

    public MyForm()
    {
        IntializeComponents();
        bs.DataSource = data;

       listBox1.DisplayMember = "Name";
       listBox1.ValueMember = "Id";
       listBox1.DataSource = bs;
    }

    private void buttonAddData_Click(object sender, EventArgs e)
    {
       var selection = (MyData)comboBox1.SelectedItem;
       data.Add(selection);

       bs.ResetBindings(false);
    }
}

تغيير عناصر التحكم في مصدر البيانات أثناء الطيران ينتج نتيجة غريبة في وقت ما.

26
gzaxx

لم يكتشف مربع القائمة أنك قمت بتغيير DataSource. سيتم تحديثه فقط عندما يتغير Datasource ، لذلك اضبط DataSource على القيمة الفارغة أولاً:

listBox1.DataSource = null;
listBox1.DataSource = data;

يمكنك أيضًا مسح العناصر ثم تعيين مصدر البيانات مرة أخرى:

listBox1.Items.Clear();
listBox1.DataSource = data;
16
rajeemcariazo

ربما لم يكن هذا الحل أفضل في الأداء ، ولكن بعد العديد من المحاولات وبضع ساعات ، كان ما نجح لي:

تم تنفيذ هذا السطر في مُنشئ النماذج:

listBox1.DataSource = myData;

This lines were executed after the information was modified:
listBox1.DataSource = new List<Movil>();
listBox1.DataSource = myData;

آمل أن يساعد!

0
Federico De Luca

بدلاً من ذلك ، وربما تكون أكثر الطرق الصحيحة لتنفيذ ذلك هي استخدام المقدمة ObservableCollection<T> . تم تصميمه بغرض وحيد هو تطبيق INotifyCollectionChanged.

public partial class MyForm : Form
{
    ObservableCollection<MyData> data = new ObservableCollection<MyData>();

    public MyForm()
    {
        listBox1.DataSource = data;
        listBox1.DisplayMember = "Name";
        listBox1.ValueMember = "Id";
    }

    private void buttonAddData_Click(object sender, EventArgs e)
    {
       var selection = (MyData)comboBox1.SelectedItem;
       data.Add(selection);
    }
}

لان ObservableCollection<T> تنفذ INotifyCollectionChanged سيقوم رابط DataSource بتحديث ListBox تلقائيًا كلما تغيرت بياناتك.

0
jduncanator

استدعاء ShowData() عند تهيئة النموذج لملء مربع القائمة الخاص بك عند التهيئة

 public Department()
        {
            InitializeComponent();
            ShowData();
        }

ShowData() Method ، حيث يتم تعيين BindingSource ، DisplayMember و ValueMember

private void ShowData()
            {
                using (var uow = new UnitOfWork(new SellContext()))
                {
                    listBox1.DataSource = uow.Departments.GetAll().ToList();
                    listBox1.DisplayMember = "DepartmentName";
                    listBox1.ValueMember = "DepartmentId"; 
                    //listBox1.Invalidate();       
                }
            }

في التطبيق أدناه ، عند حذف قسم من قاعدة البيانات ، يتم تحديث مربع القائمة بالمجموعة الحالية

private void button1_Click(object sender, EventArgs e)
    {
        try {
            using (var uow = new UnitOfWork(new SellContext()))
            {
                int count = uow.Departments.FindDepartmentByName(txtDeptName.Text.ToString());
                if (count>0)
                {
                    MessageBox.Show("This Department Already Exists", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                }

                else
                {
                    department dept = new department();
                    dept.DepartmentName = txtDeptName.Text.ToString();
                    uow.Departments.Create(dept);
                    if (uow.Complete() > 0)
                    {           
                        MessageBox.Show("New Department Created", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        txtDeptName.Text = "";
                        ShowData();      
                    }
                    else
                    {
                        MessageBox.Show("Unable to add Department", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtDeptName.Text = "";
                        ShowData();
                    }
                }
            }                              
        }
        catch(Exception ex)
        {
            ex.ToString();
        }
    }
0
Frank Odoom