Problem with saving the Data of programmaticaly created uitable

1 visualizzazione (ultimi 30 giorni)
I create a variable size uitable programmaticly (not using GUIDE) which works well. What I am struggling with is saving the content of the created table, it keeps telling "Reference to non-existent field 'load_table'". Even if I try to save it in another callback it keeps telling the same error. Any ideas? much appreciated.
  3 Commenti
Mus'ab Ahmad
Mus'ab Ahmad il 15 Gen 2016
Modificato: Stephen23 il 15 Gen 2016
I have already attached a snapshot of the code. However here is the code:
% --- Executes on selection change in Act_Menu.
function Act_Menu_Callback(hObject, eventdata, handles)
Actuators = cellstr(get(hObject,'String')); %returns popupmenu3 contents as cell array
Actuator_selected = Actuators{get(hObject,'Value')}; %returns selected item from popupmenu3
Dynamic_states = evalin('base','Dynamic_states');
switch Actuator_selected
case 'Actuator 1'
moves = [1:Dynamic_states(1),]'
loads = zeros(size(moves))
tabledata =[moves loads]
columnname = {'Move', 'Load Mass'};
columnformat = {'char', 'short'};
columneditable = [false true];
load_table = uitable('Units','pixels','Position',[50 270 152 100],'ColumnWidth','auto','Data', tabledata,'ColumnName', columnname,'ColumnFormat', columnformat,'ColumnEditable', columneditable,'RowName',[] ,'BackgroundColor',[.7 .9 .8],'ForegroundColor',[0 0 0]);
case 'Actuator 2'
moves = [1:Dynamic_states(2),]'
loads = zeros(size(moves))
tabledata =[moves loads]
columnname = {'Move', 'Load Mass'};
columnformat = {'char', 'short'};
columneditable = [false true];
load_table = uitable('Units','pixels','Position',[50 270 152 100],'ColumnWidth','auto','Data', tabledata,'ColumnName', columnname,'ColumnFormat', columnformat,'ColumnEditable', columneditable,'RowName',[] ,'BackgroundColor',[.7 .9 .8],'ForegroundColor',[0 0 0]);
case 'Actuator 3'
moves = [1:Dynamic_states(3),]'
loads = zeros(size(moves))
tabledata =[moves loads]
columnname = {'Move', 'Load Mass'};
columnformat = {'char', 'short'};
columneditable = [false true];
load_table = uitable('Units','pixels','Position',[50 270 152 100],'ColumnWidth','auto','Data', tabledata,'ColumnName', columnname,'ColumnFormat', columnformat,'ColumnEditable', columneditable,'RowName',[] ,'BackgroundColor',[.7 .9 .8],'ForegroundColor',[0 0 0]);
end
And the error message is:
Reference to non-existent field 'load_table'.
Error in EnergyTool_GUI>Act_Menu_Callback (line 2518)
val_Load_Table = get(handles.load_table,'Data');
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in EnergyTool_GUI (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in @(hObject,eventdata)EnergyTool_GUI('Act_Menu_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback

Accedi per commentare.

Risposte (1)

Walter Roberson
Walter Roberson il 15 Gen 2016
You use handles.load_table but you never created that. You created load_table without storing it in handles
  3 Commenti
Walter Roberson
Walter Roberson il 15 Gen 2016
guihandles(load_table) looks through the figure that contains the load_table graphics object and finds all graphics objects with non-empty Tag where the Tag is a legal variable name, and creates a structure with one field for each of those tags.
When you then guidata() that structure, it effectively becomes (or replaces) the handles structure for all later calls.
If, in a later routine, you then try to access handles.table_handles that field would only exist if there had been a graphics object with Tag 'table_handles'
The uitable() that you are creating have no Tag, so even if they were created before the guihandles() call then they would not be recorded in the structure.
What you probably want is that once your handles structure has been created, and you have assigned table_handles the appropriate uitable() value,
handles.table_handles = table_handles;
guidata(hObject, handles);
Mus'ab Ahmad
Mus'ab Ahmad il 19 Gen 2016
Modificato: Walter Roberson il 19 Gen 2016
This code works:
handles.Load_Data = uitable('Units','pixels','Data', tabledata,.....);
And then in the save button callback
val_Load_Table = get(handles.Load_Data,'Data');
handles.mydata.Load_Table_val = val_Load_Table;
Thanks everybody for your suggestions :)

Accedi per commentare.

Categorie

Scopri di più su Migrate GUIDE Apps in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by