Kann verhindert werden, dass ein nutzbares Popup-Menü angezeigt wird? Oder: Wie erhalte ich einen Rückruf, indem ich auf eine Zelle klicke und den Zeilen- und Spaltenindex zurückgebe?

Für eine Benutzeroberfläche programmiere ich eineuitable. Der Benutzer wählt eine OptionA, B oder C in der ersten Spalte und die Unteroption in der zweiten Spalte hängt auch davon ab, was in der ersten ausgewählt wurdeA.1, A.2 oder A.3 oderB.1, B.2 oder B.3 oder das gleiche fürC

Den Code für die Tabelle finden Sie inAnhang A.

Wenn der Benutzer zuerst die Hauptoption definiert, werden die Unteroptionen automatisch entsprechend auf nur gültige Auswahlmöglichkeiten reduziert. Dies wird durch Auswertung derCellEditCallback für Spalte 1 und Zurücksetzen derColumnFormat für Spalte 2. (FunktionmodifySelection imAnhang B) Wenn der Benutzer jetzt feststellt, dass er einen Fehler gemacht hat und eine Unteroption ein anderes Mal bearbeiten muss, wird dieColumnFormat wird weiterhin gemäß der zuvor bearbeiteten Hauptoption festgelegt, und die gültigen Auswahlmöglichkeiten sind nur verfügbar, wenn er die Hauptoption ein anderes Mal auswählt. (siehe blaue Markierung im Bild).

Um dies zu beheben, implementierte ich auch dieCellSelectionCallback Aufrufen der FunktionjustifySelection (imAnhang B), was durch Auswahl überprüft wird, welche Option in Spalte 1 ausgewählt wurde, um wieder die richtigen Unteroptionen für Spalte 2 anzubieten. Da dieser Rückruf jedoch auf Auswahl reagiert, muss ich auswählenzweimal, einmal um die auszulösenCellSelectionCallback und eine andere, um tatsächlich meine Entscheidungen zu treffen. Bei großen Tischen kann dies sehr ärgerlich sein!

Meine Frage lautet also:

Gibt es eine Möglichkeit, das Auftauchen des Popup-Menüs in Spalte 2 zu verhindern, bis herausgefunden wurde, was der Inhalt der entsprechenden Spalte 1 ist, sodass sofort die gültigen Auswahlmöglichkeiten angeboten werden?

Oder:

Wie kann ich einen Mausklick auf eine Zelle erkennen und den Zeilen- und Spaltenindex abrufen? Aber ohne die folgende Auswahl aufzurufen und Aktion aufzurufen?

Ich habe schon alles geharktverfügbare Eigenschaften aber nichts gefunden, was nützlich sein könnte. Vielleicht könnte man mit dem etwas anfangenButtonDownFcn, aber wie bekommt man die Zellindizes? Was ist mitBusyAction Eigentum, wie kann das für meinen Zweck verwendet werden?

Irgendwelche Ideen?

Es tut mir im Voraus leid, dass ich Sie mit so viel Code bombardiert habe, es ist bereits das minimalste Beispiel, aber vollständig ausführbar, sodass Sie es ausprobieren können.

Anhang A / B

function fancyUitable 

selector_1 = { 'A'; 'B' ; 'C' };
selector_2 = { 'first select first row!' };

h = figure('Position',[200 100 268 120],'numbertitle','off','MenuBar','none');

defaultData =  repmat( {'select main option...', 'select suboption...'} ,5,1);
columnname =   {'Option                             ',...
                'Suboption                          '};
columnformat = { {selector_1{:}}, selector_2 };
columneditable =  [true true]; 
t = uitable(h,'Units','normalized','Position',[0 0 1 1],...
              'Data', defaultData,... 
              'ColumnName', columnname,...
              'ColumnEditable', columneditable,...
              'ColumnFormat', columnformat,...  
              'RowName',[],...
              'CellEditCallback',@modifySelection,...
              'CellSelectionCallback',@justifySelection);

set(h,'Tag','Config_figure')
set(t,'Tag','Config_table')
end

%   **Appendix B**
%   (part of the same function file)


function modifySelection(~,evt_edit)
if evt_edit.Indices(2) == 1
    modifyPopup( evt_edit.Indices(1) );
end
end

function justifySelection(~,evt_select)
try  %to surpress an unimportant error
    if evt_select.Indices(2) == 2
        modifyPopup( evt_select.Indices(1) );
    end
end
end

und schließlich die einzelne FunktionmodifyPopup was das umschreibtColumnformat:

function  modifyPopup( row )
    id_group_1 = {'A.1';'A.2';'A.3'};
    id_group_2 = {'B.1';'B.2';'B.3'};
    id_group_3 = {'C.1';'C.2';'C.3'};
    id_default = {'select main option first'};

    myfigure = findobj('Tag','Config_figure');
    config_data = get(findobj(myfigure,'Tag','Config_table'),'Data');
    selector = config_data(row,1);
    selector = selector{1};

    config_format = get(findobj(myfigure,'Tag','Config_table'),'ColumnFormat');
    switch selector
        case 'A'
            config_format{2} = id_group_1';
        case 'B'
            config_format{2} = id_group_2';
        case 'C'
            config_format{2} = id_group_3';
        otherwise
            config_format{2} = id_default;
    end
    set(findobj(myfigure,'Tag','Config_table'),'ColumnFormat',config_format)
end

Kopfgeld: Warum nur +50? - Ich denke, es ist entweder nicht möglich oder die Antwort ist einfach, sobald man die richtige anfängliche Idee hatte. Ich suche keine komplexe Problemumgehung mit Java-Objekteigenschaften usw. Vielen Dank im Voraus!

Ich füge die Diskussion aus den Kommentaren hier hinzu, um den Überblick zu behalten:

Wenn Sie es ausprobieren möchten, können Sie den Code kopieren und die folgenden Schritte ausführen, um das unerwünschte Verhalten zu reproduzieren:

Wählen Sie in der ersten Zeile die Hauptoption A aus.Die Unteroption in der ersten Zeile enthält dann die Auswahlmöglichkeiten A.1, A.2 und A.3.Wählen Sie in der zweiten Zeile die Hauptoption B aus. Daher stehen in der zweiten Zeile die Optionen B.1, B.2 und B.3 für die Unteroption zur VerfügungABER JETZT möchten Sie die Unteroption in der ersten Zeile (direkt) ändern; Sie würden erwarten, die Wahlen A.1, A.2 und A.3 zu erhalten; aber du nicht. Sie erhalten angeboten B.1, B.2 & B.3; - Weil die letzte Hauptoption, die Sie ausgewählt haben, B war (obwohl in einer anderen Reihe).

Anstatt nach der letzten Option zu suchen, sollten Sie sich anscheinend die entsprechende Option ansehen. Stellen Sie also entweder sicher, dass durch Klicken auf eine Unteroption eine Suche durchgeführt wird, um festzustellen, welche Hauptoption vorhanden ist.

Genau das suche ich! Aber wie könnte ich das machen?Wie Sie den Klick erkennen, die Spalten- und Zeilenindizes abrufen und den richtigen Wert festlegenColumnFormat und dann endlich die Zelle aufspringen lassen. Die einzige Möglichkeit, die ich bis jetzt sehe, ist dieCellSelectionCallback, aber es wird ausgeführt, nachdem die Zelle bereits mit den ungültigen Auswahlmöglichkeiten aufgetaucht ist. Ich würde eine Art brauchenClickedCallback, wie es ist fürpushbuttons

oder stellen Sie sicher, dass durch Auswahl einer Hauptoption nur die Unteroptionen für diese Zeile festgelegt werden.

Dies ist nicht möglich. Sie können keine Unteroption für eine bestimmte Zeile festlegen, da Sie Änderungen vornehmen müssenColumnFormatDies betrifft die gesamte Tabelle und nicht nur eine Zeile.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage