簡體   English   中英

C#WinForms System.InvalidCastException

[英]C# WinForms System.InvalidCastException

我有一個帶有工具欄按鈕的C#WinForms應用程序,以及兩個名為"frmMultiCategoryProject""frmTiebreaker" MDI子"frmTiebreaker" 根據工具欄按鈕的Text屬性,在工具欄按鈕的Click()事件中會發生不同的動作。

這是代碼:

    private void tsbtnAddShowTiebreaker_Click(object sender, EventArgs e)
    {
        if (tsbtnAddShowTiebreaker.Text == "Add Tiebreaker" || tsbtnAddShowTiebreaker.Text == "Show Tiebreaker")
        {
            foreach (frmMultiCategoryProject frmamdic in this.MdiChildren)
            {
                frmamdic.SendToBack();
                frmamdic.Hide();
                frmamdic.Visible = false;
            }
            frmTiebreaker frmTB = new frmTiebreaker(Tiebreaker);
            frmTB.MdiParent = this;
            frmTB.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmTB.Dock = DockStyle.Fill;
            frmTB.Show();
            tsbtnCloseProject.Visible = true;
            frmTB.BringToFront();
            tsbtnAddShowTiebreaker.Text = "Hide Tiebreaker";
        }
        else if (tsbtnAddShowTiebreaker.Text == "Hide Tiebreaker")
        {
            string strMdiChildren = "";

            foreach (frmTiebreaker frmTB in this.MdiChildren)    // This is where the InvalidCastException occurs.
            {
                strMdiChildren += frmTB.Name.ToString() + "\r\n";
                this.Tiebreaker = frmTB.Tiebreaker;
                frmTB.Dispose();
            }

            foreach (frmMultiCategoryProject frmamdic in this.MdiChildren)
            {
                frmamdic.BringToFront();
                frmamdic.Show();
            }

            tsbtnAddShowTiebreaker.Text = "Show Tiebreaker";
        }
    }  

這就是問題所在(frmMain.cs:line 2359是帶有注釋的那個):

System.InvalidCastException was unhandled
  HResult=-2147467262
Message=Unable to cast object of type 'Trivia_Author_v20.frmMultiCategoryProject' to type 'Trivia_Author_v20.frmTiebreaker'.
  Source=Trivia Author v20
  StackTrace:
       at Trivia_Author_v20.frmMain.tsbtnAddShowTBIsClicked() in c:\Users\Reuben\Documents\Visual Studio 2013\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 frmTB 2\Trivia Author v10 New Approach\frmMain.cs:line 2359
       at Trivia_Author_v20.frmMain.tsbtnAddShowTiebreaker_Click(Object sender, EventArgs e) in c:\Users\Reuben\Documents\Visual Studio 2013\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 frmTB 2\Trivia Author v10 New Approach\frmMain.cs:line 2256
       at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       at System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ToolStrip.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at Trivia_Author_v20.Program.Main(String[] args) in c:\Users\Reuben\Documents\Visual Studio 2013\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 frmTB 2\Trivia Author v10 New Approach\Program.cs:line 116
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

為什么我的代碼在任何時候都無法分辨它正在處理哪種類型的表格?

foreach循環不會將其項過濾為您聲明的類型; 它只是嘗試強制轉換,並且在失敗時將拋出該異常。

要進行過濾,請使用.OfType<T>()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM