Satpal Lakhera Ответов: 1

Исключение InvalidOperationException было необработанное


Описание ошибки:
Необработанное исключение типа " System.InvalidOperationException " произошло в системе.Окна.Forms.dll

Дополнительная информация: операция Кросс-потока недопустима: управление " осуществляется из потока, отличного от потока, в котором он был создан.

у меня есть мое заявление как:

// - - - - - - - Библиотека классов, содержащая данные из sql server

namespace libDataStore
{
    public class csGetData
    {


        static string strCon =                ConfigurationManager.ConnectionStrings["MyCon"].ToString();
        SqlConnection con = new SqlConnection(strCon);
        
        public Single crossEl {get; set;}

        public void getCrossEl()
        {           
            SqlConnection conGetCrossEl = new SqlConnection(strCon);
            conGetCrossEl.Close();
            conGetCrossEl.Open();
            SqlCommand cmd1 = new SqlCommand("usp_getCrossEl", conGetCrossEl);
            cmd1.CommandType = CommandType.StoredProcedure;
            try
            {
                SqlDataReader dr = cmd1.ExecuteReader();
                dr.Read(); 
                crossEl = 0;
                crossEl = Convert.ToSingle(dr[0].ToString());                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());                
            }            
            conGetCrossEl.Close();
            conGetCrossEl.Dispose();
        }
         

    }

}


//------------- Еще одна библиотека классов, содержащая панели


namespace libPanels
{   
    public class csCrossEl   //from ClassLibrary libPanels

    {                       
        Label lblCrossElHeading = new Label();
        Label lblCrossEl = new Label();
        TextBox txtCrossEl = new TextBox();
        Label lblCrossElNew = new Label();
        TextBox txtCrossElNew = new TextBox();
        Button btnCrossElReset = new Button();
        Button btnCrossElSave = new Button();
        Button btnCrossElCancel = new Button();

        FlowLayoutPanel dynPnlCrossEl = new FlowLayoutPanel();
        public void createPanelCrossEl()
        {
            //Panel dynamicPanelEl = new Panel();
            dynPnlCrossEl.Location = new System.Drawing.Point(0, 27);
            dynPnlCrossEl.Size = new Size(741, 416);
            dynPnlCrossEl.Name = "panelCrossEl";

            //Label lblCrossElHeading = new Label();
            lblCrossElHeading.Location = new Point(330, 34);
            lblCrossElHeading.Size = new Size(125, 13);
            lblCrossElHeading.Text = "Cross Elasticity";
            lblCrossElHeading.Font = new Font(lblCrossElHeading.Font, FontStyle.Bold);

            //Label lblCrossEl = new Label();
            lblCrossEl.Location = new Point(164, 132);
            lblCrossEl.Size = new Size(175, 13);
            lblCrossEl.Text = "Cross Elasticity:";

            //TextBox txtCrossEl = new TextBox();
            txtCrossEl.Location = new Point(379, 129);
            txtCrossEl.Size = new Size(156, 20);
            txtCrossEl.Enabled = false;

            //Label lblCrossElNew = new Label();
            lblCrossElNew.Location = new Point(159, 252);
            lblCrossElNew.Size = new Size(175, 13);
            lblCrossElNew.Text = "New Cross Elasticity :";

            //TextBox txtCrossElNew = new TextBox();
            txtCrossElNew.Location = new Point(379, 249);
            txtCrossElNew.Size = new Size(156, 20);

            //Button btnCrossElReset = new Button();
            btnCrossElReset.Location = new Point(153, 365);
            btnCrossElReset.Size = new Size(93, 23);
            btnCrossElReset.Text = "Reset";
            btnCrossElReset.Click += new EventHandler(this.btnCrossElReset_Click);

            //Button btnCrossElSave = new Button();
            btnCrossElSave.Location = new Point(379, 365);
            btnCrossElSave.Size = new Size(93, 23);
            btnCrossElSave.Text = "Save";
            btnCrossElSave.Click += new EventHandler(btnCrossElSave_Click);

            //Button btnCrossElCancel = new Button();
            btnCrossElCancel.Location = new Point(603, 365);
            btnCrossElCancel.Size = new Size(93, 23);
            btnCrossElCancel.Text = "Cancel";
            btnCrossElCancel.Click += new EventHandler(btnCrossElCancel_Click);

            
            dynPnlCrossEl.Controls.Add(lblCrossElHeading);
            dynPnlCrossEl.Controls.Add(lblCrossEl);
            dynPnlCrossEl.Controls.Add(txtCrossEl);
            dynPnlCrossEl.Controls.Add(lblCrossEl);
            dynPnlCrossEl.Controls.Add(txtCrossEl);
            dynPnlCrossEl.Controls.Add(btnCrossElReset);
            dynPnlCrossEl.Controls.Add(btnCrossElSave);
            dynPnlCrossEl.Controls.Add(btnCrossElCancel);

            //this.Controls.Add(dynPnlCrossEl);
            Form.ActiveForm.Controls.Add(dynPnlCrossEl);    //This line causes stated error

        }

        public void addFunctionality()
        {
            csGetData obdata = new csGetData();
            obdata.getCrossEl();
            txtCrossEl.Text = Convert.ToString(obdata.crossEl);

        }

        protected void btnCrossElReset_Click(object sender, EventArgs e)
        {
            txtCrossEl.Clear();
        }

        protected void btnCrossElSave_Click(object sender, EventArgs e)
        {
            if (txtCrossEl.Text == "")
            { MessageBox.Show("Please fill Proper Values.."); }
            else
            {
                try
                {
                    //do_something
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

            }

        }

        protected void btnCrossElCancel_Click(object sender, EventArgs e)
        {
            //HideAllPanel();
            //dynamicPanelWelcome.Visible = true;
        }
    }
}



//и это для отображения :

namespace MyProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();          
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            csCrossEl obCrossEl = new csCrossEl();            
            obCrossEl.addFunctionality();
            obCrossEl.createPanelCrossEl();
        }
    }
}


Что я уже пробовал:

У меня есть это приложение с еще двумя библиотеками классов, в которых одна содержит данные, а вторая создает панель
т
я думаю, что проблема возникает из-за того, что класс панели имеет тенденцию отображать данные в активной форме
активная форма-это один поток, а библиотеки классов - два других потока?
как ее решить??

Member 11712753

Какая именно строка вызывает исключение??

Satpal Lakhera

Форма.ActiveForm.Controls.Добавить (dynPnlCrossEl);

1 Ответов

Рейтинг:
2