【问题标题】:Matlab AppDesigner: Listbox from ExcelMatlab AppDesigner:来自 Excel 的列表框
【发布时间】:2021-01-12 20:53:34
【问题描述】:

我正在应用设计工具中创建一个应用。我想要做的是在选择一个或多个选项时,这些选项被赋值为 1。

列表(即“列”)按以下方式读取,并将列表选项分配给默认值为0的结构变量。

table1 = readtable("file.xls");

for i = 1:length(rmmissing(table1{:,"Column"}))
    s.(char(rmmissing(table1{i,"Column"}))) = 0;
end

这会输出下表。

s.Anna = 0 
s.Bett = 0
s.Cyrielle = 0
s.Dylan = 0

我的问题是,每当我突出显示其中一个选项时,我都无法找到将值从 0 更新为 1 的方法。我不知道如何从本质上获取选定的值并对其进行更新。

例如,如果我突出显示“Anna”和“Cyrielle”,它们应该更新为 1,如下所示。

s.Anna = 1
s.Bett = 0
s.Cyrielle = 1
s.Dylan = 0 

我尝试了类似的 if 语句。虽然这可行,但这意味着我必须对名称进行硬编码,这是我不想要的。所以它需要动态挑选出被选中的名字。

    if app.ColumnListBox.Value == "Anna"
        s.Anna = 1;
    else
        s.Anna = 0;
    end

列表框如下所示: Listbox

选择一个名字时我得到的输出是:

s = 

  struct with fields:

        Anna: 1
        Bett: 0
    Cyrielle: 0
       Dylan: 0

但是,如果我选择多个选项,一切都会变为 0: Multiple names

s = 

  struct with fields:

        Anna: 0
        Bett: 0
    Cyrielle: 0
       Dylan: 0

现在的代码如下:

names = fieldnames(s);
for j = 1:numel(names)
    name = names{j};
    if app.ListBox.Value == string(name)
            s.(name) = 1;
        else
            s.(name) = 0;
    end
end

assignin("base","s",s)  

任何帮助将不胜感激!

【问题讨论】:

  • 你试过什么?你的具体问题是什么?你看过assignin 函数文档吗?将松散变量分配给您的工作区是不好的做法,因为您几乎无法控制覆盖或名称安全性,更好的计划是将它们分配给具有命名字段的结构。
  • @Wolfie,我更新了帖子。希望现在更清楚一点。

标签: excel matlab listbox


【解决方案1】:

您应该能够使您的 if 条件不那么硬编码,例如

names = fieldnames(s);
for iField = 1:numel(names)
    % Assign current name to variable, e.g. "Anna"
    name = names{iField};
    % loop over the fields and check if selected
    if app.ColumnListBox.Value == string(name)
        s.(name) = 1;
    else
        s.(name) = 0;
    end

【讨论】:

  • 谢谢沃尔夫。这有效,但是只有当我突出显示一个选项时。一旦我突出显示多个,它就会将其设置回默认值。
  • 如果您选择多个列表框value,您能否编辑您的问题以包含更多详细信息?一个单元数组,您也可以循环或使用ismember 而不是==
  • 添加了更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2021-01-18
  • 2018-08-07
  • 2021-11-09
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多