ListBox 数据源自动重置不适用于 C++/CLI 中的列表

问题描述 投票:0回答:1

我有一个 C++/CLI 的 WinForm 项目。我使用列表作为列表框的数据源。我将 myList 定义为 mainForm(void) 中列表框的数据源。在用户界面中,当用户单击按钮1时,程序将文本框->文本添加到列表中。并刷新列表框。但ListBox不显示任何数据。经过一番研究,我在每次点击后设置数据源,效果很好。但这使代码变得复杂。

public ref class MainForm : public System::Windows::Forms::Form
{
public:
    MainForm(void)
    {
        InitializeComponent();
        
        List1= gcnew List<String^>();
        List2= gcnew List<String^>();

        listBox1->DataSource = List1;
        listBox2->DataSource = List2;

    }
.
.
.
    private: List<String^>^ List1;
    private: List<String^>^ List2;

.
.
.
    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        List1->Add(textBox9->Text);
        List2->Add(textBox11->Text);

        //List1->Sort();
        //List2->Sort();

        listBox1->Refresh();
        listBox2->Refresh();

        textBox9->Clear();
        textBox11->Clear();


    }

如果我使用 BindingList 它工作正常。但我想使用List类型的排序方法。为什么我每次都必须设置列表框的数据源属性?绑定有问题吗?还是内存管理问题?或者这是正常的方法吗?

c# .net list listbox c++-cli
1个回答
0
投票

在 Windows 窗体中,列表框或其他数据绑定友好的控件使用CurrencyManager 显示数据项。该CurrencyManager 监视数据源中的项目并检测更改。

但是,CurrencyManager 可能无法自动检测数据源中的更改。因此,当您再次设置 DataSource 时,您实际上是在更新CurrencyManager 并获取新数据。

当我们使用 BindingList 等方法时,它们会自动检测数据结构的变化并触发必要的事件。

© www.soinside.com 2019 - 2024. All rights reserved.