绑定列表框以索引C#

时间:2014-07-30 06:53:47

标签: c# winforms data-binding listbox

我不知道是否可能,但我想要的是这样的 在WinForm listbox1中有一个行列表(从文件中复制)

在另一个Thread和类中,我运行在一个List上,每行包含相同的行,DoSomething 一旦我完成该行,我希望列表框中的索引更改

从我的基本和有限的理解,我的方法是使用Event来激活形式,而不是使用Invoke(不用于交叉线程)

是否有办法以某种方式以listbox循环绑定到for/foreach的索引?

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

在另一个班级

class RunScript
{
//..

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

}

1 个答案:

答案 0 :(得分:2)

确保在INotifyPropertyChanged课程中实施RunScript。这是一个完整的样本:

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();
}

注意我在async/await中使用了RunScriptList,如果你在另一个线程中执行它,则需要在主线程中触发PropertyChanged事件以避免跨线程异常。