Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 09.10.2015, 13:51   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 670
По умолчанию Как в C# Visual Studio Windows Forms создать кнопку с 2 состояниями

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

if (button1 == 'True'){
while 1
{//мой код}
}

if (button1 == 'False'){//Тупое ленное вековое гробовое немногословно-бессловесное ожидание}

Как можно такое сделать?
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 14:16   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Есть такое понятие как обработчик нажатия кнопки. Обычно в него можно попасть дважды кликнув на нужной кнопке в дизайнере.
p51x вне форума Ответить с цитированием
Старый 09.10.2015, 14:29   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 670
По умолчанию

А может как-то проще можно сделать? Я понял, что при каждом нажатии на кнопку я могу изменять значение некоторой переменной с True на False, а при обработке менять цвет кнопки, например.
Но вот можно подробнее насчет "нужной кнопки в дизайнере"?
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 14:50   #4
Alex11223
Заблокирован
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Чего подробнее?
Alex11223 вне форума Ответить с цитированием
Старый 09.10.2015, 15:03   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Цитата:
Сообщение от Krasi Посмотреть сообщение
А может как-то проще можно сделать? Я понял, что при каждом нажатии на кнопку я могу изменять значение некоторой переменной с True на False, а при обработке менять цвет кнопки, например.
Ну зависит от задачи и проектирования. Можно отдельный рабочий поток запустить и кнопкой переключать его состояние, модно цикл в кнопку всунуть,...
p51x вне форума Ответить с цитированием
Старый 09.10.2015, 16:13   #6
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 670
По умолчанию

А, понятно, ну я-то в курсе события Click. Мне-то именно это и надо, чтобы кнопка принимала 2 состояния - нажатое, и отжатое. Сейчас я имею лишь кнопку, на которую можно просто кликать, у меня по этому клику выполняется код, 1 раз.

А мне-то надо так: нажал на кнопу - она изменилась и стала нажатой, и циклически работает тот код, который я прописал для такого положения кнопки. Вот как это сделать?

Я на таком уровне в решении данного вопроса:
Код:
 private void button1_Click(object sender, EventArgs e)
        {
            btn1pos = !btn1pos;

            if (btn1pos == true)
            {
                this.Controls["button1"].UseWaitCursor = false;
            }

            if (btn1pos == false)
            {
                this.Controls["button1"].UseWaitCursor = true;
            }

        }
Думаю, что все можно сделать намного проще, вот и спрашиваю.

Последний раз редактировалось Krasi; 09.10.2015 в 16:15.
Krasi вне форума Ответить с цитированием
Старый 09.10.2015, 16:18   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

1. Берете CheckBox и Appearance ставите в Баттон.
2. Делаете какой-либо флаг и перерисовываете кнопку соответствующе.
3. Используйте сторонние компоненты
4. Сами отрисуйте
...
p51x вне форума Ответить с цитированием
Старый 09.10.2015, 16:23   #8
Alex11223
Заблокирован
 
Регистрация: 12.01.2011
Сообщений: 19,503
По умолчанию

Да куда уж проще, вроде и так просто.

В чем смысл писать Controls["button1"] если у вас уже есть созданная дизайнером переменная button1?

И == true/false обычно не пишут для boolean выражений. Достаточно if(btn1Pos)/if(!btn1Pos) (или просто else).
Alex11223 вне форума Ответить с цитированием
Старый 09.10.2015, 17:30   #9
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 670
По умолчанию

А можете подсказать, что у меня происходит не так? То есть сейчас вроде при первом нажатии должен работать мой код, а при втором - не должен, при третьем - снова должен и тп. Так вот, рассмотрим ситуацию на деле.

Код:
private void button1_Click(object sender, EventArgs e)
        {
            btn1pos = !btn1pos;
            ZedGraphControl zedGraph = new ZedGraphControl();
            zedGraph.Location = new System.Drawing.Point(100, 10);
            zedGraph.Name = "zedGraph";
            zedGraph.Size = new System.Drawing.Size(500, 300);
            this.Controls.Add(zedGraph);
            ZedGraphControl zgc = zedGraph;
            GraphPane myPane = zgc.GraphPane;


            if (btn1pos)
            {
                this.Controls["button1"].UseWaitCursor = false;
                /////////////////Представляем символы в двоичном виде и выводим на график/////////////////
                //////////////////////////////////////////////////////////////////////////////////////////  
                string A = richTextBox1.Text;
                string str_bin = asbin(A);

                byte[] strBytes = System.Text.Encoding.Unicode.GetBytes(A);
                //string str = Encoding.ASCII.GetString(strBytes);

                StringBuilder sb = new StringBuilder();
                foreach (byte b in System.Text.Encoding.Unicode.GetBytes(A))
                    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')).Append(' ');

                string binaryStr = sb.ToString();                  //////////////Массив 0 и 1

                this.Controls["richTextBox2"].Text = str_bin;
                ////////////////////////////////////////////////////////////////Создание значений x

              
                // Set the titles and axis labels
                myPane.Title = "Бинарные данные";
                myPane.XAxis.Title = "n, выборки";
                myPane.YAxis.Title = "bin_data, единицы";
                PointPairList list = new PointPairList();

                int l = strBytes.Length;
                int[] myArr = new int[l];
                // Инициализируем каждый элемент массива вручную
                for (int i = 0; i < l; i++) {
                    myArr[i] = i;
                    list.Add(myArr[i], strBytes[i]);
                }

                LineItem myCurve = myPane.AddCurve("bin_data",
                    list, Color.Green, SymbolType.Diamond);
                zgc.AxisChange();
                zgc.Refresh();

              
            }

            if (!btn1pos)
            {
                this.Controls["button1"].UseWaitCursor = true;

            }

        }

        static string chr2(char c)
        {
            string s = " ";
            for (; c != '\0'; c = (char)((byte)c >> 1)) s = ((((byte)c & 1) != 0) ? "1" : "0") + s;
            return s;
        }
        static string asbin(string s)
        {
            string res = "";
            foreach (char c in s) res += chr2(c);
            return res;
        }
Я нажимаю на этот батон) первый раз, и тогда строится график и в окошко №2 выводятся бинарные данные текста, введенного в окошко №1. Теперь мистика. Я сокращаю текст. Нажимаю батон, теперь он false, нажимаю еще, он снова true. И график должен бы поменяться, как и содержимое окна № 2. Но содержимое окна меняется, а вот график остается прежним. Где я что упустил?
Krasi вне форума Ответить с цитированием
Старый 16.10.2015, 12:26   #10
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 670
По умолчанию

Код:
 private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                this.Controls["checkBox1"].ForeColor = Color.Green;
                /////////////////Представляем символы в двоичном виде и выводим на график/////////////////
                //////////////////////////////////////////////////////////////////////////////////////////  
                string A = richTextBox1.Text;
                string[] B = new string[1000];

                int i = 0;
                foreach (char x in A)
                {
                    B[nSymbol] += x;
                    i++;
                    if (i == 56) { i = 0; nSymbol++; }
                }
                //this.Controls["richTextBox2"].Text = B[1];
                string s = "Hello";
                {
                    for (i = 1; i <= 5; i = i + 1)
                    {
                        s = s + i.ToString();
                        this.Controls["richTextBox2"].Text = s;
                        this.Refresh();
                        Thread.Sleep(500);
                        if (!this.checkBox1.Checked) { i = 5; }
                    }
                }
            }
            else
            {
                this.Controls["checkBox1"].ForeColor = Color.DarkRed;
                this.Controls["richTextBox2"].Text = "";
            }
        }
Сейчас у меня 2 состояния с помощью CheckBox с опцией Button. Когда состояние нажатое, программа заходит в цикл, в котором обновляет форму, поэтому я на экране сейчас вижу, как у меня текстовое поле все время дополняется новыми символами. Но я не могу остановить этот процесс! Я бы хотел нажать на кнопку (которая чек баттон) второй раз, и чтобы произошел выход из цикла. Но я понял, что меня сдерживает то, что все операции уже происходят в теле функции нажатия на кнопку. Что мне делать?
Krasi вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в Visual Studio 2008 (C++) в windows Forms построить график по файл-данным графика? sherochka555 Visual C++ 1 03.05.2014 13:39
C# Windows Forms(Visual Studio 2010), textBox настройка Artiomtb Помощь студентам 2 08.08.2012 08:18
C# Windows Forms(Visual Studio 2010), Radiobutton Artiomtb Помощь студентам 5 08.07.2012 18:37
как в Visual Studio 2010 создать кнопку в рабочей области окна? ajs Visual C++ 0 09.12.2011 00:59