我有一个 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类型的排序方法。为什么我每次都必须设置列表框的数据源属性?绑定有问题吗?还是内存管理问题?或者这是正常的方法吗?
在 Windows 窗体中,列表框或其他数据绑定友好的控件使用CurrencyManager 显示数据项。该CurrencyManager 监视数据源中的项目并检测更改。
但是,CurrencyManager 可能无法自动检测数据源中的更改。因此,当您再次设置 DataSource 时,您实际上是在更新CurrencyManager 并获取新数据。
当我们使用 BindingList 等方法时,它们会自动检测数据结构的变化并触发必要的事件。