diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index 3fd0fefc5a..34dd9b817d 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -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(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(); } diff --git a/tests/controls/itemcontainertest.cpp b/tests/controls/itemcontainertest.cpp index ab54a49702..48944ad0a8 100644 --- a/tests/controls/itemcontainertest.cpp +++ b/tests/controls/itemcontainertest.cpp @@ -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 }