簡體   English   中英

將列表框綁定到索引C#

[英]bind listbox to index C#

我不知道是否可能,但是我想要的是這樣的東西:在WinForm listbox1有一個行列表(從文件復制)

在另一個線程和類中,我在一個List上運行,該List包含相同的行,我解析的每一行和DoSomething一旦完成該行,我都希望列表框中的索引發生變化

從我的基本和有限的理解出發,我的方法是使用Event來觸發表單,而不是使用Invoke(因為不要跨線程)

有沒有辦法通過for/foreach循環以某種方式綁定到listbox索引?

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

在另一堂課

class RunScript
{
//..

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

}

確保在RunScript類中實現INotifyPropertyChanged 這是一個完整的示例:

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

注意我在RunScriptList使用了async/await ,如果在另一個線程中執行了此操作,則需要在主線程中觸發PropertyChanged事件,以避免跨線程異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM