【问题标题】:Revit API WinForms - Passing ComboBox value back to CommandRevit API WinForms - 将 ComboBox 值传递回命令
【发布时间】:2020-03-07 00:18:14
【问题描述】:

我正在尝试将 WinForm 中的值(元素 ID)传递回 Command.cs 文件,但出现错误:

 System.NullReferenceException: Object reference not set to an instance of an object.
   at BatchSheetMaker.Command.Execute(ExternalCommandData commandData, String& message, ElementSet elements)

我在这里关注 youtube 教程,它看起来相当简单直接,但返回到 Command.cs 是另一层复杂性。

我将 Command.cs 代码包装在 try/catch 块中,它只是告诉我有 nullReferenceException,但它并没有告诉我它发生在哪一行。我有looked around,但没有找到任何关于如何使调试显示错误行的提示。如果有人有任何其他指示,那会很有帮助。

Form1.cs

 public partial class Form1 : System.Windows.Forms.Form
    {
        private UIApplication uiapp;
        private UIDocument uidoc;
        private Autodesk.Revit.ApplicationServices.Application app;
        private Document doc;

        private string myVal;

        public string MyVal
        {
            get { return myVal; }
            set { myVal = value; }
        }

        public Form1(ExternalCommandData commandData)
        {
            InitializeComponent();

            uiapp = commandData.Application;
            uidoc = uiapp.ActiveUIDocument;
            app = uiapp.Application;
            doc = uidoc.Document;
    }

    public delegate void delPassData(System.Windows.Forms.ComboBox text);
    private void Form1_Load(object sender, EventArgs e)
        {
            //Create a filter to get all the title block types.
            FilteredElementCollector colTitleBlocks = new FilteredElementCollector(doc);
            colTitleBlocks.OfCategory(BuiltInCategory.OST_TitleBlocks);
            colTitleBlocks.WhereElementIsElementType();

            foreach(Element x in colTitleBlocks)
            {
                comboBox1TitleBlockList.Items.Add(x.Name);
            }
        }


    private void button1Continue_Click(object sender, EventArgs e)
        {
            MyVal = comboBox1TitleBlockList.Text;
        }

Command.cs

    Form1 form1 = new Form1(commandData);
    String elementString = form1.MyVal.ToString();
    Element eFromString = doc.GetElement(elementString);
    ElementId titleBlockId = eFromString.Id;

    ViewSheet sheet = ViewSheet.Create(doc, titleBlockId);


【问题讨论】:

  • 如果你只是注释掉你的 try/catch 的东西,调试器就会出现在有问题的行上。
  • 很公平。我原以为会有更聪明的方法来仍然有一个 try/catch 并让你的程序告诉你它在 try catch 中失败的地方而不会使程序崩溃

标签: c# winforms revit-api revit


【解决方案1】:

Run your entire add-in inside the Visual Studio debugger 并逐行浏览您的代码。这将向您显示引发异常的确切位置,并使您能够轻松识别导致问题的原因。

【讨论】:

  • 星期一会做,@JeremyTammik。谢谢你。只是认为 try/catch 块有一种方法可以告诉我它在 try 块内失败的位置,而不是默认为 catch 块并回滚。
  • 所以我找到了空行。它最终变成了这个:String elementString = form1.MyVal.ToString(); 但是我仍然找不到将值从 form1.cs 发送到 Command.cs 的方法。我找到了很多方法来展示如何发送到另一个 form.cs 但不是针对 Command.cs 实例。在哪里可以找到有关此信息的任何线索?@Jeremey Tammik
  • 这是一个经常被回答的基本 C# 问题,例如,这里:stackoverflow.com/questions/2387336/…
【解决方案2】:

将我的代码更改为此代码并开始工作:

form1.cs

 public string MyVal;
        //{

            //get { return myVal; }
            //set { myVal = value; }
        //}

this link was helpful 以及 youtube 上有关如何在表单之间传递值的教程。

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 2013-12-13
    • 2023-04-05
    • 1970-01-01
    • 2018-10-03
    • 2019-01-15
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多