C#:组件的输出参数索引 [i] 过高或过低

标签 c# parameters grasshopper

运行以下代码时出现如下错误信息:

c#: Output Parameter Index[1] too high or too low for Component.

IGH_DataAccess 已经在它说“获取当前迭代计数” 的帮助中提供了迭代计数。在解决方案期间第一次在组件上调用 SolveInstance() 函数时,迭代计数器将为零。每次后续调用都会将其递增 1。使用 DA.SetData(0, m_settings[0]); 时,它会显示第一行。

错误消息出现在使用的程序中,我在 DA.SetData(i, m_settings[i]); 上得到以下异常:

发生System.Exception 消息=未知文件 来源=蚱蜢 堆栈跟踪: 在 C:\dev\Grasshopper\1.0\root\src\GH_GlobalProc.vb:line 98 中的 Grasshopper.Global_Proc.ASSERT(Guid assert_id, String message, Exception exception) 内部异常:

后面是对 IGH_DataAccess.SetData 方法的描述:在 GH_Component.SolveInstance() 期间将数据存储在输出参数中。此功能仅用于设置单个数据项。如果您想设置数据列表,您*必须*改为调用 SetDataList()。

当将代码更改为 DA.SetDataList(i, m_settings[i]); 时,第一行的字符被拆分,而我希望每一行都被拆分。

我做错了什么?

string[] m_settings;

public void ShowSettingsGui()
{
    var dialog = new OpenFileDialog { 
                     Filter = "Data Sources (*.ini)|*.ini*|All Files|*.*" };
    if (dialog.ShowDialog() != DialogResult.OK) return;
    m_settings = File.ReadAllLines(dialog.FileName);
    ExpireSolution(true);
}

protected override void SolveInstance(IGH_DataAccess DA)
{
    if (m_settings == null)
    {
        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, 
                          "You must declare some valid settings");
        return;
    }

    for (var i = 0; i < m_settings.Length; i++)
    {
        DA.SetData(i, m_settings[i]);
    }
}

提前致谢!

最佳答案

这是通过使用以下代码解决的,将 SetData 替换为 SetDatalist,没有循环和不同的字符串拆分方式:

  string m_settings_temp;
            string[] m_settings;
            public void ShowSettingsGui()
            {
                var dialog = new OpenFileDialog { Filter = "Data Sources (*.ini)|*.ini*|All Files|*.*" };
                if (dialog.ShowDialog() != DialogResult.OK) return;

                m_settings_temp = File.ReadAllText(dialog.FileName);
                m_settings = m_settings_temp.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                ExpireSolution(true);
            }



            protected override void SolveInstance(IGH_DataAccess DA)
            {
                if (m_settings == null)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "You must declare some valid settings");
                    return;
                }

                else

                {  
                        DA.SetDataList(0, m_settings);
                }  

            }

关于C#:组件的输出参数索引 [i] 过高或过低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11933961/

相关文章:

c# - ASP.NET 网站管理工具访问规则按钮丢失

android - 如何以编程方式在 Android 中包含布局?

php - 在mysql中使用变量作为参数

c# - append 订阅者方法中收到的字符串?

c# - 如何获取 Array.IndexOf<string>(string[], string) 方法信息?

c# - 使用 SQL Server 插入 C# 后返回 id

C# 互操作到除 c\c++ 以外的较低级别

ajax - 在 jQuery Mobile 中通过 ajax 加载带参数的 url

python - 如何在 Grasshopper 中用 Python 构造一个区间

c# - 从 C# 中的列表访问对象参数