bind listbox to index C#

瘦欲@ 提交于 2019-12-08 04:44:50

问题


I dont know if it possible but what I want is something like that In WinForm listbox1 has a list of lines(copied from file)

In another Thread and class I run on a List that contains the same lines each line I parse and DoSomething once I finish with that line I want the index in the listbox to change

from my basic and limited understanding my approach was with an Event to fire in form and than maybe using Invoke (for not to cross thread )

Is there is a way to somehow bind to index of the listbox somehow with my for/foreach loop ?

class form
{
    listBoxScript.SetSelected(ScriptCounter, true);<--bind the ScriptCounter?
}

in another Class

class RunScript
{
//..

    public void RunScriptList()
    {
        ScriptCounter = 0 ;
        foreach ( var cell in ScriptList)
        {
        ScriptCounter ++;
        //DoSomething
        }
    }

}

回答1:


Make sure you implement INotifyPropertyChanged in RunScript class. Here's a complete sample:

class RunScript : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int scriptCounter;

    private ISynchronizeInvoke invoker;
    public RunScript(ISynchronizeInvoke invoker)
    {
        if (invoker == null) throw new ArgumentNullException("invoker");
        this.invoker = invoker;
    }

    public async void RunScriptList()
    {
        ScriptCounter = 0;
        foreach (var cell in Enumerable.Range(1, 15))
        {
            ScriptCounter++;
            await Task.Delay(1000);
            //DoSomething
        }
    }

    public int ScriptCounter
    {
        get { return scriptCounter; }
        set
        {
            scriptCounter = value;
            OnPropertyChanged();
        }
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            Action action = () => handler(this, new PropertyChangedEventArgs(propertyName));
            invoker.Invoke(action, null);
        }
    }
}

private RunScript rs;
public Form1()
{
    InitializeComponent();

    rs = new RunScript(this)

    var binding = new Binding("SelectedIndex", rs, "ScriptCounter", false, DataSourceUpdateMode.OnPropertyChanged);
    listBox1.DataBindings.Add(binding);
}

private void button1_Click(object sender, EventArgs e)
{
    rs.RunScriptList();
}

Note I have used async/await in RunScriptList, If you do it in another thread you need to fire PropertyChanged event in main thread to avoid cross thread exception.



来源:https://stackoverflow.com/questions/25030445/bind-listbox-to-index-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!