//Event
void TestFrame::OnChoice1Select(wxCommandEvent& event)
{
fstream in;
string str,str2;
int i;
//File where I store my list of lists
in.open("Recursos/Carreras-LC.txt",ios::in);
//Go to an specific line of the file where the list for the current choice is
in=gotoLine(in,Choice1->GetSelection()+1);
//Gets the line with the list
getline(in,str,'\n');
in.close();
//Here is where I'll put the code to remove the current list of choices
//My code to append the items from the list i got before
i=0;
while(str[i]!='\0'){
if(str[i]==','){
Choice2->Append(_(str2));
i++;
str2="";
}else{
str2+=str[i];
i++;
}
}
}
如果还有更好的方法来执行这种动态GUI,请告诉我。预先感谢。
答案 0 :(得分:1)
我必须从选择列表中删除旧项目,然后追加新项目,但我找不到解决方法
您可以使用wxChoice :: Clear()方法从选择控件中删除所有条目,也可以使用wxChoice :: Delete(unsigned int n)方法从控件中删除特定条目。
它们在documentation page的“从wxItemContainer继承的公共成员函数”部分下列出。
如果还有更好的方法来执行这种动态GUI,请告诉我。预先感谢。
一种选择是使用wxUpdateUIEvent,以便在主机空闲时更新选择。如果您要走那条路,我会
m_choiceNeedsUpdate
或类似名称的布尔型成员和事件处理程序void OnUpdateUI(wxUpdateUIEvent& event)
(或您想调用的对象)添加到应用程序表单的类中。this->Bind(wxEVT_UPDATE_UI,&MyFrame::OnUpdateUI,this);
的调用将事件处理程序绑定到帧构造函数中
当您执行需要更新选择的操作时,可以通过以下调用安排更新:
m_choiceNeedsUpdate=true;
this->UpdateWindowUI();
更新了选择控件的事件处理程序的主体可能看起来像这样
void MyFrame::OnUpdateUI(wxUpdateUIEvent& event)
{
if (m_choiceNeedsUpdate)
{
//Update the choice control here (probably using the Clear/Delete methods)
m_choiceNeedsUpdate=false;
}
}
走这条路线的优点是,所有有关更新UI的逻辑都可以放在一个方法/事件处理程序中。如果您有几个控件可能需要动态更新,则特别好。
缺点是,当您的框架运行时,将对该事件处理程序进行大量调用,这可能会影响性能。这就是为什么我在上面的示例中使用m_choiceNeedsUpdate bool变量来保护更改选择控件的逻辑。