Message 1 of 6
ComboBox and Modeless Form - Getting error (Object reference not set...)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi!
I've seen the post about this topic in the links below:
https://forums.autodesk.com/t5/revit-api-forum/modeless-form-and-combobox/td-p/9119051.
https://forums.autodesk.com/t5/revit-api-forum/how-to-retrieve-modeless-form-s-combobox-s-text-in-ex...
However I couldn't figure it out in my code how to get data into my combobox, getting the same error: "Object reference not set to an instance of an object".
Hope someone can help me...
Command.cs
namespace ElectricalDiagrams
{
[Transaction(TransactionMode.Manual)]
public class Command : IExternalCommand
{
public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
try
{
App.thisApp.ShowForm(uiapp);
return Result.Succeeded;
}
catch(Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
}
}
App.cs
namespace ElectricalDiagrams
{
public class App : IExternalApplication
{
internal static App thisApp = new App();
private ModelessForm form;
public Result OnStartup(UIControlledApplication application)
{
form = null;
thisApp = this;
return Result.Succeeded;
}
public Result OnShutdown(UIControlledApplication application)
{
if (form != null && form.Visible)
{
form.Close();
}
return Result.Succeeded;
}
public void ShowForm(UIApplication uiapp)
{
if (form == null || form.IsDisposed)
{
RequestHandler handler = new RequestHandler();
ExternalEvent exEvent = ExternalEvent.Create(handler);
form = new ModelessForm(exEvent, handler);
form.Show();
}
}
public void WakeFormUp()
{
if (form != null)
{
form.EnableCommands(true);
}
}
}
}
RequestHandler.cs
namespace ElectricalDiagrams
{
public class RequestHandler : IExternalEventHandler
{
private Request request = new Request();
public Request Request { get { return request; } }
public string GetName()
{
return "External Event";
}
public void Execute(UIApplication uiapp)
{
try
{
switch (Request.Take())
{
case RequestId.None:
{
return;
}
case RequestId.GetPanels:
{
new GetPanels(uiapp, PanelComboBox);
break;
}
default:
{
break;
}
}
}
finally
{
App.thisApp.WakeFormUp();
}
return;
}
}
}
Request.cs
namespace ElectricalDiagrams
{
public enum RequestId : int
{
None = 0,
GetPanels = 1
}
public class Request
{
private int request = (int)RequestId.None;
public RequestId Take()
{
return (RequestId)Interlocked.Exchange(ref request, (int)RequestId.None);
}
public void Make(RequestId requestId)
{
Interlocked.Exchange(ref request, (int)requestId);
}
}
}
ModelessForm.cs
namespace ElectricalDiagrams
{
public partial class ModelessForm : Form
{
//private Document doc;
private RequestHandler requestHandler;
private ExternalEvent externalEvent;
public ModelessForm(ExternalEvent exEvent, RequestHandler handler)
{
InitializeComponent();
requestHandler = handler;
externalEvent = exEvent;
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
externalEvent.Dispose();
externalEvent = null;
requestHandler = null;
base.OnFormClosed(e);
}
public void EnableCommands(bool status)
{
foreach (Control control in this.Controls)
{
control.Enabled = status;
}
if (!status)
{
this.CancelButton.Enabled = true;
}
}
private void MakeRequest(RequestId requestId)
{
requestHandler.Request.Make(requestId);
externalEvent.Raise();
EnableCommands(false);
}
private void ModelessForm_Load(object sender, EventArgs e)
{
MakeRequest(RequestId.GetPanels);
}
private void CancelButton_Click(object sender, EventArgs e)
{
Close();
}
}
}
GetPanels.cs
namespace ElectricalDiagrams.Extensions
{
class GetPanels
{
public GetPanels(UIApplication uiapp, System.Windows.Forms.ComboBox PanelComboBox)
{
UIDocument uidoc = uiapp.ActiveUIDocument;
Document doc = uidoc.Document;
IList<Element> panelElements = new FilteredElementCollector(doc).
OfCategory(BuiltInCategory.OST_ElectricalEquipment).
WhereElementIsNotElementType().
ToElements();
List<string> panelNames = new List<string>
(panelElements.Select<Element, string>(e => e.Name.ToString()));
try
{
PanelComboBox.DataSource = panelNames;
}
catch (Exception ex)
{
TaskDialog.Show("Error", ex.ToString());
}
}
}
}