Keep the item being updated selected in wxMSW wxChoice::SetString().
Changing the text of the selected wxChoice (or wxComboBox, as it derives from it in wxMSW) item made it unselected. Fix this by explicitly restoring the selection to the item if needed. Closes #13769. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70018 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -358,6 +358,10 @@ void wxChoice::SetString(unsigned int n, const wxString& s)
|
||||
else if ( HasClientObjectData() )
|
||||
oldObjData = GetClientObject(n);
|
||||
|
||||
// and also the selection if we're going to delete the item that was
|
||||
// selected
|
||||
const bool wasSelected = static_cast<int>(n) == GetSelection();
|
||||
|
||||
::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
|
||||
::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.wx_str() );
|
||||
|
||||
@@ -367,6 +371,11 @@ void wxChoice::SetString(unsigned int n, const wxString& s)
|
||||
else if ( oldObjData )
|
||||
SetClientObject(n, oldObjData);
|
||||
|
||||
// and the selection
|
||||
if ( wasSelected )
|
||||
SetSelection(n);
|
||||
|
||||
// the width could have changed so the best size needs to be recomputed
|
||||
InvalidateBestSize();
|
||||
}
|
||||
|
||||
|
@@ -244,13 +244,16 @@ void ItemContainerTestCase::SetString()
|
||||
|
||||
container->Append(testitems);
|
||||
|
||||
container->SetSelection(0);
|
||||
container->SetString(0, "new item 0");
|
||||
CPPUNIT_ASSERT_EQUAL("new item 0", container->GetString(0));
|
||||
|
||||
// Modifying the item shouldn't deselect it.
|
||||
CPPUNIT_ASSERT_EQUAL(0, container->GetSelection());
|
||||
|
||||
// wxOSX doesn't support having empty items in some containers.
|
||||
#ifndef __WXOSX__
|
||||
container->SetString(2, "");
|
||||
#endif
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL("new item 0", container->GetString(0));
|
||||
#ifndef __WXOSX__
|
||||
CPPUNIT_ASSERT_EQUAL("", container->GetString(2));
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user