2016-12-02 134 views
0

通过运行时创建复选框:查找动态创建的CheckBox(C++ Windows窗体应用程序)

unsigned int number = getNumber(); 
CheckBox^ box; 

for(unsigned int i = 1; i <= number; i++) 
{ 
    box = gcnew CheckBox(); 
    box->Name = i.ToString(); 
    box->Text = i.ToString(); 
    box->AutoSize = true; 
    box->Location = Point(10, i * 30); 
    this->panel->Controls->Add(box);  
} 

现在,我想所有的复选框未签:

std::map<unsigned int, std::string> values; 

for (unsigned int i = 1; i <= number; i++) 
{ 
    String^ name = i.ToString(); 
    CheckBox^ box = dynamic_cast<CheckBox^>(this->panel->Controls->Find(name, true)); 
    if (!box->Checked) 
    { 
     String^ text = box->Text; 
     values.insert(std::pair<unsigned int, std::string>(i, msclr::interop::marshal_as<std::string>(text))); 
    } 
} 

我的问题是,通过运行时我得到一个NullReferenceException(在我检查框是否未选中)。 但是所有的复选框都存在。

PS:我使用Visual Studio 2015年社区更新3

+0

为什么你使用^?你是否期望像Bitwise异或赋值? – Rama

回答

0

MSDN,查找的签名是:

array<Control^>^ Find(
    String^ key, 
    bool searchAllChildren 
) 

它返回一个数组。但你是dynamic_casting它到一个CheckBox ^。这失败了,所以返回一个NULL指针。

你可以让你的代码工作,

CheckBox^ box = dynamic_cast<CheckBox^>(this->panel->Controls->Find(name, true)[0]); 

这将控件数组的第一个元素动态转换为复选框,这就是你想要的。

通常情况下,您应该找到一种方法来遍历数组中的所有内容,但在这种情况下,由于您肯定会发现只会返回一个结果,使用[0]表示法可以。

请注意,你甚至不需要Find。 (这不是非常有效。)你应该能够遍历this->panel->Controls。我不擅长管理C++,但它应该是沿线的:

foreach (control in this->panel->Controls) 
{ 
    if (control is CheckBox and static_cast<CheckBox^>(control).Checked) { 
     // do your stuff 
    } 
} 
相关问题