Войти

Показать полную графическую версию : непослушный textBox


corbis
20-04-2015, 01:57
Есть форма, на ней TextBox. При вводе ФИО, текст приводится в правильный формат написания имени, но
при этом курсор сбрасывается в начало строки и никак это дело не победить.

Add-Type -AssemblyName System.Windows.Forms

$Form1 = New-Object system.Windows.Forms.Form
$txtBox = New-Object Windows.Forms.TextBox
$txtBox.Size = New-Object Drawing.Size(200, 25)
$txtBox.Location = New-Object Drawing.Point(10, 30)
$Form1.Controls.Add($txtBox)

$txtBox.add_KeyPress({$txtBox.Text = (Get-Culture).TextInfo.ToTitleCase($txtBox.Text)
})

$Form1.Add_Shown({$Form1.Activate()})
$result = $Form1.ShowDialog()

Пробовал переводить курсор в конец строки,
$txtBox.select($txtBox.TextLength, 0)


но тогда нельзя делать исправления в тексте.

Если переводить не в конец строки, а сдвигать курсор относительно вводимого символа, то вообще
билеберда творится.

Решение нашлось. Вдруг кому пригодится:
$txtBox.add_KeyPress({
$txtLength = $txtBox.textLength
if ($txtLength -eq 1)
{
$txtBox.text = (Get-Culture).TextInfo.ToTitleCase($txtBox.Text)
$txtBox.SelectionStart = 1
}
elseif ($txtLength -gt 1 -and $txtBoxFIO.SelectionStart -lt $txtLength)
{
$SelectStart = $txtBoxFIO.SelectionStart
$txtBox.text = (Get-Culture).TextInfo.ToTitleCase($txtBox.Text)
$txtBox.SelectionStart = $SelectStart
}
elseif ($txtLength -gt 1 -and $txtBoxFIO.SelectionStart -ge $txtLength)
{
$txtBox.text = (Get-Culture).TextInfo.ToTitleCase($txtBox.Text)
$txtBox.SelectionStart = $txtLength
}
})

Iska
20-04-2015, 06:10
$txtBox.add_KeyPress({
$SelectionStart = $txtBox.SelectionStart
$SelectionLength = $txtBox.SelectionLength

$txtBox.text = (Get-Culture).TextInfo.ToTitleCase($txtBox.Text)

$txtBox.SelectionStart = $SelectionStart
$txtBox.SelectionLength = $SelectionLength
})
Выбор события KeyPress для реализации ProperCase — не самый удачный выбор.

corbis
20-04-2015, 15:12
А какое событие больше подходит? Это мой первый более-менее серьезный опыт с формами.
comboBox тоже победить не могу. Надо его прозрачным сделать, но сохранить картинку на основной форме.
Вычитал, что надо создавать control и ему уже присваивать backcolor trnsparent. Только вот с реализацией пока туго.

Спасибо. Так гораздо культурнее выглядит.

Iska
21-04-2015, 00:28
А какое событие больше подходит? »
Я бы попробовал пользовать выход из элемента управления/потерю фокуса, например.

comboBox тоже победить не могу. Надо его прозрачным сделать, но сохранить картинку на основной форме.
Вычитал, что надо создавать control и ему уже присваивать backcolor trnsparent. Только вот с реализацией пока туго. »
Приводите Ваш код. Коллеги, возможно, подскажут.

corbis
21-04-2015, 01:38
Ну, собственно, можно взять за пример тот же код выше.
Add-Type -AssemblyName System.Windows.Forms

$Form1 = New-Object system.Windows.Forms.Form
$comboBox = New-Object Windows.Forms.ComboBox
$comboBox.Size = New-Object Drawing.Size(200, 25)
$comboBox.Location = New-Object Drawing.Point(10, 30)

# А вот как написать это:
SetStyle(System.Windows.Forms.ControlStyles.SupportsTransparentBackColor, $true)
# я не пойму.

$ComboBox.BackColor = [System.Drawing.Color]::Transparent

$Form1.Add_Shown({$Form1.Activate()})
$result = $Form1.ShowDialog()




© OSzone.net 2001-2012