Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > panel


Автор: larinva 11.8.2010, 10:54
Народ помогите думал, что разобрался оказывается не совсем. Не могу сообразить, ситуация такая: имею 2 формы form1 на ней расположена panel1, на  form2 кнопка по нажатию которой происходит сканирование сети , находятся компы к ним прибавляется картинка. Нужно чтобы найденные картинки добавились на panel1 form1. Пож-та

Автор: larinva 11.8.2010, 11:55
Народ помогите

Автор: Springtime 11.8.2010, 12:11
BeginInvoke
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.begininvoke.aspx

Автор: KelTron 11.8.2010, 12:17
Что именно не получается?

Автор: larinva 11.8.2010, 12:25
не получается на нажатию кнопки на form2 добавить на form1 panel1 найденный результат user posted image это нужно добавить

Автор: KelTron 11.8.2010, 12:38
Вот тебе пример с листбоксом, что тебе надо по аналогии..

Автор: larinva 11.8.2010, 12:51
получается мне нужно передать в panel вот это. Как это сделать

Код

 List<WorkStat> workstat = new List<WorkStat>(); //массив компов

private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString() ,0, 0);
                workstat.Add(workst);                
            }
}

Автор: Springtime 11.8.2010, 13:02
Цитата(larinva @  11.8.2010,  12:51 Найти цитируемый пост)
получается мне нужно передать в panel вот это. Как это сделать


BeginInvoke
http://msdn.microsoft.com/en-us/library/sy...egininvoke.aspx

Автор: larinva 11.8.2010, 13:17
делаю так и ничего 
Код

this.mainForm.mapPanel.BeginInvoke(new MethodInvoker(delegate { workstat.Add(workst); }));

Автор: KelTron 11.8.2010, 13:30
Springtime, наверно тебя не понял, т.к. BeginInvoke тут вообще не при чём.

Нифига непонятно что ты хочешь, уже и так тебе пример дал в котором всё наглядно, формулируй свой вопрос внятно и может тебе кто то поможет.

Автор: larinva 11.8.2010, 13:52
мне нужно в panel вот это
Код

List<WorkStat> workstat = new List<WorkStat>(); //массив компов
private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString() ,0, 0);
                  
тут нужно найденное добавить на panel form1    workst   
      
            }
}

Автор: Springtime 11.8.2010, 14:16
Цитата(KelTron @  11.8.2010,  13:30 Найти цитируемый пост)
наверно тебя не понял, т.к. BeginInvoke тут вообще не при чём.


Это ты наверное не совсем понял -

Цитата(larinva @  11.8.2010,  10:54 Найти цитируемый пост)
имею 2 формы form1 на ней расположена panel1


ДВЕ ФОРМЫ!!!!!

Цитата(larinva @  11.8.2010,  10:54 Найти цитируемый пост)
 form2 кнопка по нажатию которой происходит сканирование сети


НА ФОРМЕ-2 КНОПКА!

Цитата(larinva @  11.8.2010,  10:54 Найти цитируемый пост)
Нужно чтобы найденные картинки добавились на panel1 form1


ТО ЕСТЬ НА ФОРМУ-1!!!

ЧТОБЫ ОДНА ФОРМА ВЗАИМОДЕЙСТВОВАЛА С ДРУГОЙ!!!!
В ТОМ ЧИСЛЕ ДОБАВЛЯЛА ЭЛЕМЕНТЫ.

Автор: larinva 11.8.2010, 14:24
проблемы взаимодействия нет, проблема с добавление найденных элементов ТОЛЬКО НА ПАНЕЛЬ НА ДР КОНТРОЛЫ ПРОБЛЕМ НЕТ !!!

Автор: Springtime 11.8.2010, 14:29
покажи как это делаешь?

Автор: larinva 11.8.2010, 14:32
Код

List<WorkStat> workstat = new List<WorkStat>(); //массив компов
private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString() ,0, 0);
                  
тут нужно найденное добавить на panel form1    workst   
      
            }
}


Автор: Springtime 11.8.2010, 14:59
Цитата(larinva @  11.8.2010,  14:32 Найти цитируемый пост)
List<WorkStat> workstat = new List<WorkStat>(); //массив компов
private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString() ,0, 0);
                  
тут нужно найденное добавить на panel form1    workst   
      
            }
}


где у тебя передача параметров в другую форму?

http://www.gotdotnet.ru/forums/3/38584/

Автор: larinva 11.8.2010, 15:07
Цитата

тут нужно найденное добавить на panel form1    workst 

Автор: Springtime 11.8.2010, 15:10
Цитата(larinva @  11.8.2010,  15:07 Найти цитируемый пост)
тут нужно найденное добавить на panel form1    workst 

не добавишь ты контролы из одной формы в другую, ты можешь только передать параметры другой форме на создание по определённым правилам и с определёнными параметрами требуемых тебе контролов.

Автор: larinva 11.8.2010, 15:21
мне и не нужно добавлять ни каких контролов, а нужно добавить массив компов которые нишлись на саму панель вот в таком виде user posted image должна получиться карта сети 

Автор: Springtime 11.8.2010, 15:29
Цитата(larinva @  11.8.2010,  15:21 Найти цитируемый пост)
добавить массив компов


бугага )))))

массив компов - это у тебя системные блоки с мониторами или без мониторов?

Автор: larinva 11.8.2010, 15:57
с монитором

Автор: KelTron 11.8.2010, 16:05
Цитата(Springtime @  11.8.2010,  14:16 Найти цитируемый пост)
ДВЕ ФОРМЫ!!!!!

Цитата(Springtime @  11.8.2010,  14:16 Найти цитируемый пост)
НА ФОРМЕ-2 КНОПКА!

Цитата(Springtime @  11.8.2010,  14:16 Найти цитируемый пост)
ТО ЕСТЬ НА ФОРМУ-1!!!ЧТОБЫ ОДНА ФОРМА ВЗАИМОДЕЙСТВОВАЛА С ДРУГОЙ!!!!В ТОМ ЧИСЛЕ ДОБАВЛЯЛА ЭЛЕМЕНТЫ.

Без паники..)
Ладно, ты понял что надо сделать, но BeginInvoke тут вообще не при чём.

Цитата(larinva @  11.8.2010,  12:51 Найти цитируемый пост)
получается мне нужно передать в panel вот это. Как это сделать

Цитата(larinva @  11.8.2010,  13:52 Найти цитируемый пост)
мне нужно в panel вот это

Видимо тут только один выход остался, нужно произнести заклинание: "О, великая  panel! Прими от меня этот скромный дар - массив компов. И да будут они добавлены, и да построится карта сети! Аминь. "

Автор: larinva 11.8.2010, 16:18
неужели никому не понятно что мне нужно

Добавлено через 4 минуты и 48 секунд
если вот этот код добавить в кнопку на form1 то все замечательно добавляется в текущую panel
Код

        private void addCompButton_Click(object sender, EventArgs e)
        {
            WorkStat workst = new WorkStat("Comp" + workstat.Count.ToString(), 0, 0);
            workstat.Add(workst);
            mapPanel.Invalidate();
        }

нужно тоже самое только из form2 при нажатии на кнопку

Автор: Fortnox 11.8.2010, 16:33
larinva, от чего наследуется класс WorkStat? Если от класса, представляющего собой элемент управления, то:
Код

public partial class Form2 : Form
    {
        private Form1 form1;

        public Form2(Form1 form1)
        {
            InitializeComponent();
            this.form1 = form1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 4; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString(), 0, 0);
                this.form1.panel.Controls.Add(workst); // и изменить доступ panel на Public в первой форме
            }
        }
    }

либо создать метод в первой форме на добавление элемента в панель:
форма раз:
Код

public void AddNewWorkStation(WorkStat ws)
        {
            this.panel.Controls.Add(ws);
        }

форма два:
Код

public partial class Form2 : Form
    {
        private Form1 form1;

        public Form2(Form1 form1)
        {
            InitializeComponent();
            this.form1 = form1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 4; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString(), 0, 0);
                this.form1.AddNewWorkStation(workst);
            }
        }
    }

KelTron уже кидал проект, в котором достаточно было изменить листбокс на панель.
Да и следовало бы описать, что за класс WorkStat и workst в твоем коде.

Автор: larinva 11.8.2010, 16:42
Fortnox первый случай не прокатывает я уже пробовал вываливаются ошибки
1 Ошибка    3    Наиболее подходящий перегруженный метод для "System.Windows.Forms.Control.ControlCollection.Add(System.Windows.Forms.Control)" имеет несколько недопустимых аргументов    G:\NetworkMonitoring\NetworkMonitoring\WizardNetworkForm.cs    279    17    NetworkMonitoring

2, Ошибка    4    Аргумент "1": преобразование типа из "NetworkMonitoring.WorkStat" в "System.Windows.Forms.Control" невозможно    G:\NetworkMonitoring\NetworkMonitoring\WizardNetworkForm.cs    279    53    NetworkMonitoring

Вот сам класс WorkStat
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace NetworkMonitoring
{
    class WorkStat
    {
        const int DEFAULT_WIDTH = 50;
        const int DEFAULT_HEIGHT = 46;

        Image computerImage = NetworkMonitoring.Properties.Resources.WorkStation;

        public WorkStat(string name, int x, int y)
        {
            this.Name = name;
            this.X = x;
            this.Y = y;
            this.Width = DEFAULT_WIDTH;
            this.Height = DEFAULT_HEIGHT;
        }

        #region Свойства

        public string Name {get; set;}
        public int X {get; set;}
        public int Y {get; set;}
        public int Width {get; set;}
        public int Height {get; set;}

        public Size Size
        {
            get {return new Size(Width, Height);}
        }

        public Point Location
        {
            get {return new Point (X, Y);}
        }

        #endregion 

        #region Открытые методы

        public void Draw(Graphics g)
        {
            g.DrawImage(computerImage, X, Y, Width, Height);
            g.DrawString(Name, SystemFonts.DefaultFont, 
                SystemBrushes.WindowText, new Point(X,Y + Height));
        }

        #endregion


    }
}


 

Автор: Fortnox 11.8.2010, 16:49
larinva, наследуйте класс WorkStat от Control, раз этот класс является визуальным, избавитесь от многих проблем.
Код

    public class WorkStat : Control
    {
        const int DEFAULT_WIDTH = 50;
        const int DEFAULT_HEIGHT = 46;

        Image computerImage = NetworkMonitoring.Properties.Resources.WorkStation;

        public WorkStat(string name, int x, int y)
        {
            this.Name = name;
            this.Location = new Point(x, y);
            this.Width = DEFAULT_WIDTH;
            this.Height = DEFAULT_HEIGHT;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.DrawImage(computerImage, this.Location.X, this.Location.Y, Width, Height);
            e.Graphics.DrawString(Name, SystemFonts.DefaultFont,
                SystemBrushes.WindowText, new Point(this.Location.X, this.Location.Y + Height));
        }
    }

Автор: VirusUZ 11.8.2010, 16:52
Listview или UserControl

Автор: larinva 11.8.2010, 16:58
Fortnoxпри таком способе выводит ошибку
Код

public void AddNewWorkStation(WorkStat ws)
        {
            this.panel.Controls.Add(ws);
        }


Ошибка    1    Несовместимость по доступности: доступность типа параметра "NetworkMonitoring.WorkStat" ниже доступности метода "NetworkMonitoring.MainForm.AddNewWorkStation(NetworkMonitoring.WorkStat)"    G:\NetworkMonitoring\NetworkMonitoring\MainForm.cs    24    21    NetworkMonitoring

Автор: Fortnox 11.8.2010, 17:07
larinva, установите доступность public классу WorkStat:
Код

public class WorkStat : Control
{
// прочий код
}

Автор: larinva 11.8.2010, 18:14
сделал доступность public классу WorkStat ошибка исчезла но и ничего не добавляется smile  (((

Автор: Springtime 11.8.2010, 19:24
Цитата(KelTron @  11.8.2010,  16:05 Найти цитируемый пост)
BeginInvoke тут вообще не при чём

Да конечно, давайте организуйте взаимодействие между двумя потоками форм.

Автор: larinva 11.8.2010, 19:47
Springtime не сочтите за грубость но вы уже достали своими потоками. Покажите пример уж коли так

Автор: larinva 12.8.2010, 08:28
похоже что переменная workst пустая потому, что на панель ничего не добавляется

form1
Код

 public void AddNewWorkStation(WorkStat ws)
        {
            this.mapPanel.Controls.Add(ws);
        }



form2
Код

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                WorkStat workst = new WorkStat(checkedListBox1.Items[i].ToString(), 0, 0);                
                this.mainForm.AddNewWorkStation(workst);   
            }        
        }



Автор: Fortnox 12.8.2010, 10:26
larinva, сделал небольшой пример.

Автор: larinva 12.8.2010, 11:05
отлично Fortnox smile  щас посмотрю

Автор: larinva 12.8.2010, 11:39
сп-бо тебе Fortnox что со мной долго мучился и пример то что нужно с меня +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)