sadmoh Ответов: 2

Пожалуйста, я хочу получить ответ , когда я генерировать переключатель динамически в нескольких группа , она работает, как они в одном групповом блоке


я хочу, чтобы каждая группа работала в одиночку
а вот и код
---------------------------------------------------------------------
            Random rnd = new Random();
            int mo = rnd.Next(1, 5);  // 1 <= month < 13
            int check = 0;
            Random rand = new Random();
            int[] lotto = new int[5];
            for (int i = 0; i < lotto.Length; )
            {
                check = rand.Next(1, 10);

                if (!lotto.Contains(check))
                {
                    lotto[i] = check;
                    i++;
                }

            }
            VScrollBar scb = new VScrollBar();
            scb.Height = 200;
            scb.Width = 10;
            SqlConnection con = new SqlConnection("Data Source=ahmed-hp\\exp;Initial Catalog=Elearning;Integrated Security=True");
        SqlCommand cmd;
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter("select Qu_sec,Qu_name from Qustions where Qu_sec in(" + lotto[0] + "," + lotto[1] + "," + lotto[2] + "," + lotto[3] + "," + lotto[4] + ")", con);
DataTable dt = new DataTable();
da.Fill(dt);
for (int o = 0; o < 5; o++)
{
    Label lb = new Label();
    lb.Name = lb1 + o.ToString();
    sd = dt.Rows[o][1].ToString();
    lb.AutoSize = true;
    lb.Text = (o + 1).ToString() + " - " + sd; 
    lb.Location = new Point(100 , (100 + o * 130));
    lb.Font = new Font(lb.Font, FontStyle.Bold);
    this.Controls.Add(lb);

    SqlDataAdapter da1 = new SqlDataAdapter("select An_name,An_true from Answers where An_sec='" + dt.Rows[o][0].ToString() + "'", con);
    DataTable dt1 = new DataTable();
    da1.Fill(dt1);
    GroupBox gb = new GroupBox();
    gb.Name = "gb" + o.ToString();
    gb.Location = new Point(60, 110+o*130);
    gb.Size = new Size(50, 105);
    gb.Text = o.ToString();
    for (int k = 0; k < 4; k++)
    {
        if ((bool)(dt1.Rows[k][1]) == true)
        {
            vc[o] = k + 1;
        }
        
        RadioButton rb = new RadioButton();
        rb.Name = "rb" +o.ToString()+ k.ToString();
        Label lbl = new Label();
        lbl.Name = lb1 + k.ToString();
         lbl.AutoSize = true;
        lbl.Text = "      - " + dt1.Rows[k][0].ToString();
        rb.Location = new Point(80, (100 + (o * 130) + (k + 1) * 22));
        lbl.Location = new Point(100, (100 + (o *130) +(k+1)* 22));
        this.Controls.Add(lbl);
        gb.Controls.Add(rb);
        this.Controls.Add(rb);
       
     }

     this.Controls.Add(gb);
    this.Update();

---------------------------------------------------------

Что я уже пробовал:

я хочу, чтобы каждая группа работала в одиночку с их Радиобуттоном
С наилучшими пожеланиями всем вам

OriginalGriff

"для первого ответа , это просто домашняя работа, и я никогда не оставляю свою базу данных для проблем!!!"
Это не имеет значения.
Если вы привыкнете делать это неправильно, вы всегда будете делать это неправильно - и тогда вы будете задаваться вопросом, Что случилось с вашей базой данных в один прекрасный день, потому что вы никогда не вернетесь и не исправите "рабочий код".

Заведите привычку делать правильные вещи, даже для одного, "одноразового" приложения, и у вас никогда не будет проблем. Кроме того, это делает ваш код более легким для чтения, более ремонтопригодным - а значит, и более надежным.

BillWoodruff

Знаете ли вы, как создать и использовать UserControl ?

2 Ответов

Рейтинг:
1

OriginalGriff

Это не решение проблемы, которую вы заметили, а серьезная проблема, которую вам нужно решить на протяжении всего вашего приложения, прежде чем вы даже подумаете о том, чтобы двигаться вперед.

Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


sadmoh

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

Переключатель[] БРБ = новый переключатель[20];
Группа[] ГБ = новый упорядочения[5];
for (int b = 0; b < 5; b++)
{
Группа БГ = новая группа();
gb[b] = bg;
ГБ[б].Name = "gb" + b.ToString();
ГБ[б].Местоположение = новая точка(60, 110 + b * 130);
ГБ[б].Размер = новый размер(550, 105);
ГБ[б].Text = "GBox"+b.ToString();
этот.Управления.Добавить(gb[b]);
}
for (int o = 0; o < 5; o++)
{
Этикетка lb = новая этикетка();
фунт.Название = LB1 в + о. Метод toString();
sd = "lbl"+o.Метод toString();
фунт.Авторазмер = истина;
фунт.Текст = (o + 1).ToString() + " - " + sd;
lb.Location = новая точка(100, (100 + o * 130));
фунт.Font = новый шрифт(lb.Font, FontStyle.Жирный);
этот.Управления.Добавить(фунт);
for (int k = 0; k < 4; k++)
{
RadioButton rb = новый Радиобуттон();
brb[k] = rb;
БРБ[к].Имя = "rb" +o.Метод toString()+ к.Метод toString();
если (k == 0) brb[k].Проверено = истина;
БРБ[к].Text = " - " + "RB"+o.Метод toString()+ к.Метод toString();
БРБ[к].Местоположение = новая точка(80, (100 + (o * 130) + (k + 1) * 22));
ГБ[о].Управления.Добавить(brb[k]);
этот.Управления.Добавить(brb[k]);
}
ГБ[о].CausesValidation = true;
ГБ[о].Включен = истина;
этот.Управления.Добавить(gb[o]);
}

Рейтинг:
1

RickZeeland

Я думаю, что вы должны использовать:

gb.Controls.Add(rb)
И убрать:
this.Controls.Add(rb);


RickZeeland

Может быть, это поможет, если вы сначала определите свои групповые поля перед первым циклом for ()?

BillWoodruff

+5 вы определенно определили ключевой недостаток в коде: все радиокнопки добавляются в один и тот же контейнер (форму).

Есть еще одна очевидная проблема в расположении этикеток

sadmoh

когда я удаляю
этот.Управления.Добавить(rb);
радиобаттон исчезает из формы во время выполнения

RickZeeland

Это странно, ты уверен, что у тебя есть это.Управления.Добавить(ГБ); в конце ?
Может быть, вы можете попробовать gb.BringToFront() ...

BillWoodruff

Убедитесь, что групповые поля видны и расположены правильно.

sadmoh

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

sadmoh

вот изображение для времени выполнения!!!

https://photos.google.com/share/AF1QipM5GGF8OmZlqOGlz44JbMWZ-NuM-8d3fPSb2ZE_c-pIUnFqvDuHe-71Taea4O4lRQ/photo/AF1QipO-EzznCtFlMrtIM9xUtH_KE1eN3OEvMBXkA1dh?key=clJJLWp3Wl84SVBWNDVZWnRrTDhFclBiNU9yVG9B

sadmoh

u смотрите здесь,я назвал groupBoxs как 0,1,2,3,4 , и 5, Когда я хочу проверить радиокнопку в groupBox под номером 0, ее очистили все радиокнопки для всех радиокнопок во всех groupBoxes.

RickZeeland

Вы уверены, что удалили: это.Управления.Добавить(rb) ?

BillWoodruff

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