class_docstr: The JoinerController managers a joiner setting
class_docstr_tok: ["The","JoinerController","managers","a","joiner","setting"]
code: def on_choice_changed(self, event, row, column):
      new_value = event.EventObject.GetItems()[event.GetSelection()]
      if new_value == self.DISPLAY_NONE:
          new_value = None
      joins = list(self.joins)
      while len(joins) <= row:
          joins.append(dict([(cn, "") for cn in self.column_names]))
      join = joins[row].copy()
      join[self.column_names[column]] = new_value
      if wx.GetKeyState(wx.WXK_SHIFT):
          # Fill other empty fields if present.
          for col in self.column_names:
              if (
                  join[col] in ("", None)
                  and new_value in self.v.entities[col]
              ):
                  join[col] = new_value
      joins[row] = join
      self.module_view.on_value_change(
          self.v, self.panel, self.v.build_string(joins), event
      )
  
imports: import wx
  import wx.lib.rcsizer
  from ._module_view import ModuleView
  from ..utilities.module_view import edit_control_name
label_desc: Use image node_id 12 for calling the JoinerController obj's underlying member method code with example usage: obj.on_choice_changed(event, row, column) without return types