Есть ли способ получить все элементы управления на контейнере?

Открытие и закрытие соединения занимает много времени. И используйте «использование», как предложил другой член. Я немного изменил код, но поставил SQL-создание и открытие и закрытие OUTSIDE вашей петли. Который должен немного ускорить выполнение.

  static void Main()
        {
            EventLog alog = new EventLog();
            alog.Log = "Application";
            alog.MachineName = ".";
            /*  ALSO: USE the USING Statement as another member suggested
            using (SqlConnection connection1 = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=syslog2;Integrated Security=True")
            {

                using (SqlCommand comm = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) ", connection1))
                {
                    // add the code in here
                    // AND REMEMBER: connection1.Open();

                }
            }*/
            SqlConnection connection1 = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=syslog2;Integrated Security=True");
            SqlDataAdapter cmd = new SqlDataAdapter();
            // Do it one line
            cmd.InsertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) ", connection1);
            // OR YOU CAN DO IN SEPARATE LINE :
            // cmd.InsertCommand.Connection = connection1;
            connection1.Open();

            // CREATE YOUR SQLCONNECTION ETC OUTSIDE YOUR FOREACH LOOP
            foreach (EventLogEntry entry in alog.Entries)
            {
                cmd.InsertCommand.Parameters.Add("@EventLog", SqlDbType.VarChar).Value = alog.Log;
                cmd.InsertCommand.Parameters.Add("@TimeGenerated", SqlDbType.DateTime).Value = entry.TimeGenerated;
                cmd.InsertCommand.Parameters.Add("@EventType", SqlDbType.VarChar).Value = entry.EntryType;
                cmd.InsertCommand.Parameters.Add("@SourceName", SqlDbType.VarChar).Value = entry.Source;
                cmd.InsertCommand.Parameters.Add("@ComputerName", SqlDbType.VarChar).Value = entry.MachineName;
                cmd.InsertCommand.Parameters.Add("@InstanceId", SqlDbType.VarChar).Value = entry.InstanceId;
                cmd.InsertCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = entry.Message;
                int rowsAffected = cmd.InsertCommand.ExecuteNonQuery();
            }
            connection1.Close(); // AND CLOSE IT ONCE, AFTER THE LOOP
        }
13
задан Mason Wheeler 5 January 2009 в 23:37
поделиться

3 ответа

Вы ищете эти TWinControl.Controls массив и сопровождение ControlCount свойство. Это для непосредственных детей управления. Для получения внуков и т.д. используйте стандартные рекурсивные методы.

Вы действительно не хотите Components массив (который является тем, чего for - in цикл выполняет итерации), так как ему нечего делать, в целом, с отношениями отцов и детей. Компоненты могут владеть вещами, которые не имеют никаких дочерних отношений, и средства управления могут иметь дочерние элементы, которыми они не владеют.

Также примечание, что отключение управления неявно отключает всех своих детей, также. Вы не можете взаимодействовать с детьми отключенного управления; ОС не отправляет входные сигналы им. Для создания их взгляд отключенный, тем не менее, необходимо будет отключить их отдельно. Таким образом, чтобы заставить кнопку иметь grayed текст, недостаточно отключить его родителя, даже при том, что кнопка не ответит на щелчки мышью. Необходимо отключить саму кнопку, чтобы заставить его нарисовать себя "отключено".

25
ответ дан Rob Kennedy 6 January 2009 в 09:37
поделиться
  • 1
    result == true мой главный объект неприязни. == true неявно. Если you' ре ища расширенную удобочитаемость I' d предлагают назвать Ваши переменные в честь того, что они представляют. пример: bool? isOK = myWindow.Dialog(); if (isOK ?? false) { ... } – MetaFight 27 April 2012 в 20:16

Просто

Panel.Enabled := Value;
1
ответ дан bluish 6 January 2009 в 09:37
поделиться
  • 1
    Даже если близкое (x) кнопка скрыта, пользователь мог бы все еще закрыть окно путем удара Alt-F4 или нажатия кнопки чей " IsCancel" свойство установлено " True". – Ed Noepel 4 April 2013 в 02:02

Если Вы отключаете панель, al средства управления на нем отключены также.

Рекурсивное решение с анонимными методами:

type
  TControlProc = reference to procedure (const AControl: TControl);

procedure TForm6.ModifyControl(const AControl: TControl; 
  const ARef: TControlProc);
var
  i : Integer;
begin
  if AControl=nil then
    Exit;
  if AControl is TWinControl then begin
    for i := 0 to TWinControl(AControl).ControlCount-1 do
      ModifyControl(TWinControl(AControl).Controls[i], ARef);
  end;
   ARef(AControl);
end;

procedure TForm6.Button1Click(Sender: TObject);
begin
  ModifyControl(Panel1,
    procedure (const AControl: TControl)
    begin
      AControl.Enabled := not Panel1.Enabled;
    end
  );
end;
13
ответ дан Toon Krijthe 6 January 2009 в 09:37
поделиться
  • 1
    В сеансе отладки я проверяю значение DialogResult сразу после установки его к истинному, и это является все еще пустым. – quinnapi 23 May 2009 в 03:33
Другие вопросы по тегам:

Похожие вопросы: