Не удается установить свойство AutoSize для динамически создаваемого TextBox C# VS 2017 - PullRequest
0 голосов
/ 27 марта 2020

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

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

C# не позволит мне сделать textbox1.Autosize = True;

Вот что у меня пока есть:

   TextBox textBox1 = new TextBox()
    {
        Name = i.ToString() + j.ToString() + "a",
        Text = "",
        Location = new System.Drawing.Point(xCoord + 2, yCoord + 10),
        TextAlign = HorizontalAlignment.Left,
        Font = new Font("ArialNarrow", 10),
        Width = 30,
        Enabled = true,
        BorderStyle = BorderStyle.None,
        Multiline = true,
        WordWrap = true,
        TabIndex = tabIndex + 1
    };

Как установить свойство Autosize для динамически создаваемого TextBox?

Или есть ли другой способ выполнить sh что я пытаюсь?

1 Ответ

0 голосов
/ 30 марта 2020

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

    public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
    }

    private const int EM_GETLINECOUNT = 0xba;
    [DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);

    private void Form1_Load(object sender, EventArgs e)
    {

        TextBox[,] tb = new TextBox[10, 10];
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                var txt = new TextBox();
                tb[i, j] = txt;
                tb[i, j].Name = "t";
                tb[i, j].Multiline = true;
                tb[i, j].WordWrap = true;
                tb[i, j].TextChanged += Tb_TextChanged;
                Point p = new Point(120 * i, 100 * j);
                tb[i, j].Location = p;
                this.Controls.Add(tb[i,j]);
            }

        }            
    }

    private void Tb_TextChanged(object sender, EventArgs e)
    {
        TextBox textBox = (TextBox)sender;
        var numberOfLines = SendMessage(textBox.Handle.ToInt32(), EM_GETLINECOUNT, 0, 0);
        textBox.Height = (textBox.Font.Height + 2) * numberOfLines;
    }
}

Результат: enter image description here

...