C#编写Autodesk Inventor插件时CreateDescription方法字符串为空求助
问题分析与解决方案:Inventor插件中按钮点击时
CreateDescription()返回空字符串 嘿,我一眼就揪出问题所在了——你在buttonOK_Click和buttonApply_Click方法里都调用了InitializeComponent()!
这个方法是Windows Forms用来初始化所有窗体控件的核心方法,只应该在窗体构造函数里调用一次。每次运行它,你的下拉框(comboBoxPrefix、comboBoxDescription1等)和文本框(textBoxFreeText)都会被强制重置为设计时的初始状态,用户之前选择或输入的内容会被彻底清空,这就导致CreateDescription()根本拿不到任何有效内容。
解决方案:
第一步就是把两个按钮事件里的InitializeComponent()删掉!另外我还帮你优化了代码——把重复获取Inventor应用和文档对象的逻辑提取为类成员变量,避免重复代码,提升性能。
修改后的完整代码示例:
using System; using System.Windows.Forms; using Inventor; using System.Runtime.InteropServices; namespace XXX_Property_Editor { public partial class FormPropertyEditor : Form { // 提取为类成员变量,避免重复创建 private Inventor.Application _invApp; private Document _activeDoc; public FormPropertyEditor() { InitializeComponent(); string progId = "Inventor.Application"; _invApp = (Inventor.Application)Marshal.GetActiveObject(progId); _activeDoc = (Document)_invApp.ActiveDocument; } #region Buttons private void buttonOK_Click(object sender, EventArgs e) { string userName = System.Environment.UserName; string txtDescription = CreateDescription(); SetProperty setProperty = new SetProperty(); setProperty.EditDesignTrackingProperty("Description", txtDescription, _activeDoc); setProperty.EditSummaryProperty("Title", txtDescription, _activeDoc); setProperty.EditDocumentSummaryProperty("Company", "MHS", _activeDoc); setProperty.EditSummaryProperty("Author", userName, _activeDoc); setProperty.EditDesignTrackingProperty("Designer", userName, _activeDoc); setProperty.EditDesignTrackingProperty("Engineer", userName, _activeDoc); this.Close(); } private void buttonCancel_Click(object sender, EventArgs e) { this.Close(); } private void buttonApply_Click(object sender, EventArgs e) { string userName = System.Environment.UserName; string txtDescription = CreateDescription(); MessageBox.Show(txtDescription); SetProperty setProperty = new SetProperty(); setProperty.EditDesignTrackingProperty("Description", txtDescription, _activeDoc); setProperty.EditSummaryProperty("Title", txtDescription, _activeDoc); setProperty.EditDocumentSummaryProperty("Company", "XXX", _activeDoc); setProperty.EditSummaryProperty("Author", userName, _activeDoc); setProperty.EditDesignTrackingProperty("Designer", userName, _activeDoc); setProperty.EditDesignTrackingProperty("Engineer", userName, _activeDoc); } #endregion #region Description private void comboBoxPrefix_SelectionChangeCommitted(object sender, EventArgs e) { this.labelDescription.Text = CreateDescription(); } private void comboBoxDescription1_SelectionChangeCommitted(object sender, EventArgs e) { this.labelDescription.Text = CreateDescription(); } private void comboBoxDescription2_SelectedIndexChanged(object sender, EventArgs e) { this.labelDescription.Text = CreateDescription(); } private void textBoxFreeText_TextChanged(object sender, EventArgs e) { this.labelDescription.Text = CreateDescription(); } private string CreateDescription() { string txtPrefix = this.comboBoxPrefix.GetItemText(comboBoxPrefix.SelectedItem); string txtDescription1 = this.comboBoxDescription1.GetItemText(comboBoxDescription1.SelectedItem); string txtDescription2 = this.comboBoxDescription2.GetItemText(comboBoxDescription2.SelectedItem); string txtFree = this.textBoxFreeText.Text; return $"{txtPrefix}_{txtDescription1} {txtDescription2} {txtFree}"; } #endregion } }
额外小贴士:
- 牢记
InitializeComponent()的作用:它是用来加载窗体设计器里的控件布局和初始值的,运行时绝对不能重复调用,否则会直接重置所有控件状态。 - 把重复的对象(比如Inventor应用、当前文档)提取为成员变量,既能减少代码冗余,又能避免反复调用
Marshal.GetActiveObject()带来的性能损耗。
内容的提问来源于stack exchange,提问作者lonnebol
相关产品推荐
相关产品推荐

