Приложение формы C # динамически добавленное расположение элементов - PullRequest
0 голосов
/ 14 января 2019

Во-первых, я прошу прощения за плохой язык. Я новичок в C # и пытаюсь создать простую форму приложения. При нажатии кнопки новые текстовые поля и метки будут помещены в окно. Здесь проблема. Когда я прокрутил вправо и нажал кнопку, новые добавленные элементы расположены справа от других элементов. Можете ли вы помочь мне с этой проблемой.

Нормально добавленные элементы

При прокрутке вправо

Последнее позиционирование

static int formNo = 1;

private void btnEkle_Click(object sender, EventArgs e)
{
    TextBox isimTb = new TextBox();
    TextBox fiyatTb = new TextBox();
    Label urunLbl = new Label();

    int positionNo = formNo;

    isimTb.Name = "isimBox" + formNo.ToString();
    isimTb.Location = new Point(125, ((positionNo - 1) * 25));
    isimTb.Width = 200;
    isimTb.Text = "Ürün İsmini Giriniz";

    fiyatTb.Name = "fiyatBox" + formNo.ToString();
    fiyatTb.Left = 350;
    fiyatTb.Top = (positionNo - 1) * 25;
    fiyatTb.Width = 200;
    fiyatTb.Text = "Ürün Fiyatını Giriniz";

    urunLbl.Name = "label" + formNo.ToString();
    urunLbl.Text = formNo.ToString() + ". Ürün";
    urunLbl.Left = 10;
    urunLbl.Top = (positionNo - 1) * 25;
    urunLbl.Width = 100;


    this.Controls.Add(urunLbl);
    this.Controls.Add(isimTb);
    this.Controls.Add(fiyatTb);

    btnEkle.Top = (positionNo - 1) * 25 + 50;
    btnKaydet.Top = (positionNo - 1) * 25 + 50;

    formNo++;
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Учитывайте значения свойства AutoScrollPosition при добавлении элементов управления.

/// <summary>
/// Make a point that gives a location at the given coordinates in the form
/// independent of the current scroll position
/// </summary>
private Point MakeAbsolutePosition(int x, int y)
{
    Point result = new Point(x + AutoScrollPosition.X, y + AutoScrollPosition.Y);

    return result;
}

private void btnEkle_Click(object sender, EventArgs e)
{
    TextBox isimTb = new TextBox();
    TextBox fiyatTb = new TextBox();
    Label urunLbl = new Label();

    int positionNo = formNo;

    isimTb.Name = "isimBox" + formNo.ToString();
    isimTb.Location = MakeAbsolutePosition(125, ((positionNo - 1) * 25));
    isimTb.Width = 200;
    isimTb.Text = "Ürün İsmini Giriniz";

    fiyatTb.Name = "fiyatBox" + formNo.ToString();
    fiyatTb.Location = MakeAbsolutePosition(350, (positionNo - 1) * 25);
    fiyatTb.Width = 200;
    fiyatTb.Text = "Ürün Fiyatını Giriniz";

    urunLbl.Name = "label" + formNo.ToString();
    urunLbl.Text = formNo.ToString() + ". Ürün";
    urunLbl.Location = MakeAbsolutePosition(10, (positionNo - 1) * 25);
    urunLbl.Width = 100;

    this.Controls.Add(urunLbl);
    this.Controls.Add(isimTb);
    this.Controls.Add(fiyatTb);

    // TODO: Use the correct x values here
    btnEkle.Location = MakeAbsolutePosition(100, (positionNo - 1) * 25 + 50);
    btnKaydet.Location =MakeAbsolutePosition(200,  (positionNo - 1) * 25 + 50);

    formNo++;
}

Документация для свойства AutoScrollPosition гласит :

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

Подход с использованием LayoutPanel (например, TableLayoutPanel или FlowLayoutPanel), как показано в других ответах, лучше. Вы должны использовать это, если это возможно.

0 голосов
/ 14 января 2019

У вас нет контейнера макета, например, TableLayoutPanel. Эти макеты контейнеров помогут вам расположить ваши динамически добавленные элементы управления. Я вставляю пример кода, который я сделал для динамически добавленных элементов управления:

internal void AddControl(Models.CdConfig selectedCd)
    {
        SelectedCds.Add(selectedCd);
        if (selectedCd.DataType == CdType.Combo || selectedCd.DataType == CdType.Choice)
        {
            subItemHeight = 23;
        }
        else
        {
            subItemHeight = 30;
        }
        int currItemRowCount = getItemRowCount(selectedCd);
        Panel controlPanel = new Panel() // the panel that is visible
        {
            BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle,
            Location = new Point(3,3),
            Size = new Size(this.Size.Width - margin * 2 * 2 - scrollbarbuff, itemHeight + subItemHeight * currItemRowCount)
        };

        TableLayoutPanel t1 = new TableLayoutPanel() // main tlp
        {
            ColumnCount = 1,
            RowCount = 2,
            Size = new Size(this.Size.Width - margin * 2 * 2 - scrollbarbuff, itemHeight + subItemHeight * currItemRowCount)
        };
        t1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
        t1.RowStyles.Add(new RowStyle(SizeType.Absolute, itemHeight));
        t1.RowStyles.Add(new RowStyle(SizeType.AutoSize));

        TableLayoutPanel tHeader = new TableLayoutPanel() // label and delete button
        {
            ColumnCount = 2,
            RowCount = 1,
            Size = new Size(this.Size.Width - margin * 2 * 2 - scrollbarbuff, itemHeight)
        };
        tHeader.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 80F));
        tHeader.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
        tHeader.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
        t1.Controls.Add(tHeader, 0, 0);

        // Add the label
        Label lbl = new Label()
        {
            Text = selectedCd.DisplayName,
            Anchor = AnchorStyles.Left | AnchorStyles.Top,
            Margin = new Padding(0, 3 * 2, 0, 0)
        };
        tHeader.Controls.Add(lbl, 0, 0);

        Button deleteBtn = new Button()
        {
            Text = "Delete",
            Anchor = AnchorStyles.Right | AnchorStyles.Top,
            Margin = new Padding(0, 2, 3 * 2, 0)
        };
        deleteBtn.Tag = controlPanel;
        deleteBtn.Click += HandleDelete;
        tHeader.Controls.Add(deleteBtn, 1, 0);
        controlPanel.Controls.Add(t1);

        // For the control
        TableLayoutPanel tControl = CreateCdControl(selectedCd, currItemRowCount);

        t1.Controls.Add(tControl, 0, 1);

        this.Controls.Add(controlPanel);
        controlPanel.Tag = selectedCd; // for convenience
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...