Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение типов 
V
    Опции темы
senalex
Дата 16.2.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2008

Репутация: 1
Всего: 1



Ребята, подскажите, что мне нужно сделать чтоб работал вот такой код:

Код

foreach (Control c in Form1.Controls)
{
   if (c is MyControl)
   {
      (c as MyControl).MyProperty=MyValue;
   }
}

PM MAIL   Вверх
unicuum
  Дата 16.2.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Есть такое правило: объекты производного типа можно безопасно использовать из базового.

Control (базовый)
 MyControl (производный)

Влом это на практике проверять как это работает, попробуй вместо:

Код
(c as MyControl).MyProperty=MyValue;


вот так

Код
(MyControl)c.MyProperty=MyValue;



--------------------
user posted image
обычный день на винграде
PM   Вверх
Partizan
Дата 16.2.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



unicuum, эти два варианта ничем не отличаются помимо того, что в первом случае будет NullReference, а во втором InvalidCast...если с не является объектом класса MyControl, конечно...


senalex, что конкретно не работает?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
unicuum
  Дата 16.2.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



P.S. Кстати, вот что ещё подумалось. Можно заменить первое условие, если код не хочет работать.

Код
if (c is MyControl)


заменить на

Код
if (c as MyControl != null)


Вот как то так может выглядеть

Код
foreach (Control c in Form1.Controls)
{
   if (c as MyControl != null)
   {
      (MyControl)c.MyProperty=MyValue;
   }
}


Есть ещё третий способ:

Код
foreach (Control c in Form1.Controls)
{
   try
      (MyControl)c.MyProperty=MyValue;
   catch (InvalidCastException e)
   {
      // Игнорим
   }
}


Добавлено @ 13:44
Цитата(Partizan @  16.2.2009,  13:32 Найти цитируемый пост)
unicuum, эти два варианта ничем не отличаются помимо того, что в первом случае будет NullReference, а во втором InvalidCast...

А мне все равно, отличаются они или нет. Если человек говорит не работает, я даю альтернативу. Включать VS и проверять код жутко лень. smile 

Это сообщение отредактировал(а) unicuum - 16.2.2009, 13:48


--------------------
user posted image
обычный день на винграде
PM   Вверх
Rififi
Дата 16.2.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



senalex
Ребята, подскажите, что мне нужно сделать чтоб работал вот такой код:
Очевидно, надо разместить контрол на форме, чтобы визард добавил его в коллекцию Controls.
PM MAIL   Вверх
unicuum
  Дата 16.2.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(Rififi @  16.2.2009,  13:44 Найти цитируемый пост)
Очевидно, надо разместить контрол на форме, чтобы визард добавил его в коллекцию Controls. 

В том то и дело, что это очевидно. В противном случае цикл пройдёт не найдя ни одного подходящего контрола. smile

Добавлено через 1 минуту и 38 секунд
senalex, напиши потом в чём дело было, не в том ведь, что ты забыл добавить контрол в форму smile 


--------------------
user posted image
обычный день на винграде
PM   Вверх
Partizan
Дата 16.2.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Цитата

А мне все равно, отличаются они или нет. Если человек говорит не работает, я даю альтернативу.


unicuum, странно давать альтернативу(которая по сути своей не отличается от кода топикстартера), не разобравшись до конца в ошибке...приведённый топикстартером код должен нормально отрабатывать...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Rififi
Дата 16.2.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



unicuum
В том то и дело, что это очевидно.
не вижу смысла без необходимости всё усложнять. :gigi:

Цитата
That simple, huh?
Why not?
© Ethan Hunt, "Mission Impossible 2"
PM MAIL   Вверх
unicuum
  Дата 16.2.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(Rififi @  16.2.2009,  14:23 Найти цитируемый пост)
не вижу смысла без необходимости всё усложнять. :gigi:

Так это помогает самому вспомнить различные способы сделать одно и тоже. smile А уж помог там не помог дело десятое. smile 

Ладно, в общем я запустил эту студию, и знаю в чём ошибка. Сделал форму и кинул туда элементы управления кнопку и текст.

Код
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace CastTypes
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(8, 8);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(8, 40);
            this.textBox1.Name = "textBox1";
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "textBox1";
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(136, 77);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            foreach (Control c in this.Controls)
            {
                if (c is Button)
                {
                    (c as Button).Text = "Я кнопка";
                }
            }
        }
    }
}


Глюки в том, что человека обращался к классу, а не к объекту. Я просто обратился к этому объекту формы, хотя в целом не важно к какому объекту обращаться.



--------------------
user posted image
обычный день на винграде
PM   Вверх
senalex
Дата 17.2.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2008

Репутация: 1
Всего: 1



Люди, извенити за неясно описанную проблему.

Код

foreach (Control c in Form1.Controls)
{
   if (c is MyControl)
   {
      (c as MyControl).MyProperty=MyValue;
   }
}


Здесь MyControl это потомок стандартного контрола.
В коллекции контролов родителя (формы) я его нахожу, но не могу обратиться к его свойству.
Компилятор ругается на то, что ему не известно как его конвертировать.

вот текст ошибки:
Cannot convert type 'System.Windows.Forms.Control' to 'APROComponent.Login' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

Подскажите кто сталкивался с этой проблемой, что делать.

PM MAIL   Вверх
Лен
Дата 17.2.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



senalex,
в связи с абсолютно корректным с виду кодом возникает только один вопрос:
Кто такие MyProperty и MyValue? Можешь привести код более полно?
PM MAIL   Вверх
unicuum
  Дата 17.2.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(senalex @  17.2.2009,  08:42 Найти цитируемый пост)
Люди, извенити за неясно описанную проблему.

Но Form1 это ведь не объект, если ты только не переписал всё то, что сгенерировал визард. Потому что визард генерирует класс с этим именем. А поскольку Controls не являются статическими, то ты не можешь обратится к ним через имя класса, только через объект.

Цитата(senalex @  17.2.2009,  08:42 Найти цитируемый пост)
Cannot convert type 'System.Windows.Forms.Control' to 'APROComponent.Login' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

Тебе компилятор ясно сказал, в чём ошибка. Пожалуй Partizan прав, мне не стоит телепатить не имея реального кода. Тем более что с нормальным кодом я бы давно уже всё собрал.


--------------------
user posted image
обычный день на винграде
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.