sadmoh Ответов: 2

Управление Foreach в форме


когда я запускаю нижеприведенную программу выпадающий список исчезает

foreach (Control control in this.Controls)

            {
                if (control is ComboBox)
                {
                    using (var tb = control as ComboBox)
                    {
                            SqlConnection con = new SqlConnection("Data Source = DELLXPS4; Initial Catalog = FingerPrintInfo; Integrated Security = True");
                            con.Open();
                            string str1 = "select * from " + tb.Tag.ToString();
                            SqlCommand cmd = new SqlCommand(str1, con);
                            SqlDataAdapter sda = new SqlDataAdapter(cmd);
                            DataTable dt = new DataTable();
                            sda.Fill(dt);
                            tb.ValueMember = tb.AccessibleDescription;
                            tb.DisplayMember = tb.AccessibleName;
                            tb.DataSource = dt;

                            con.Close();

                       
                    }
                }
            }

What I have tried:

<pre>                    using (var tb = control as ComboBox)
                    {
                            SqlConnection con = new SqlConnection("Data Source = DELLXPS4; Initial Catalog = FingerPrintInfo; Integrated Security = True");
                            con.Open();
                            string str1 = "select * from " + tb.Tag.ToString();
                            SqlCommand cmd = new SqlCommand(str1, con);
                            SqlDataAdapter sda = new SqlDataAdapter(cmd);
                            DataTable dt = new DataTable();
                            sda.Fill(dt);
                            tb.ValueMember = tb.AccessibleDescription;
                            tb.DisplayMember = tb.AccessibleName;
                            tb.DataSource = dt;

                            con.Close();

                       
                    }
                }
            }

Ehsan Sajjad

какие-нибудь исключения вы видите? вы пробовали поставить точку останова и посмотреть в режиме отладки?

2 Ответов

Рейтинг:
7

OriginalGriff

Хм.
Вы должны понять, что такое using блок делает:
Он предоставляет область действия для переменной и автоматически вызывает Dispose для содержимого этой переменной, когда элемент управления покидает блок любым методом.
Так что когда вы это сделаете:

using (var tb = control as ComboBox)
Вы говорите: "используйте этот существующий экземпляр элемента управления и уничтожьте его, когда я закончу.

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

Использовать только using блоки с new экземпляр класса.
А если вы используете
if (a is B)
тогда вы должны просто бросить экземпляр, а не использовать его as так же хорошо - как и должен делать Ан is проверьте себя, чтобы проверить актерский состав, так что вы просто повторяете работу!
ComboBox cb = control as ComboBox;
if (cb != null)
   {
   ...
Это прекрасно, и так оно и есть
if (control is ComboBox)
   {
   ComboBox cb = (ComboBox) control;
   ...
Но использовать и то и другое неэффективно.


Рейтинг:
20

Tony Hill

Вероятно, это происходит потому, что вы назначаете " tb " внутри оператора using, и он удаляется после выхода из блока using, который удаляет комбинацию.

пробовать

if (control is ComboBox)
{
   var tb = control as ComboBox;
   using (SqlConnection con = new SqlConnection("Data Source = DELLXPS4; Initial Catalog = FingerPrintInfo; Integrated Security = True")
   {
      con.Open();
      ...
      ...
      ...
   }