Diskuze: c# form - zakázání označování textu v komponentě textBox
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 50 zpráv z 60.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zkus použít
SelectionChanged
event a ne Mouse eventy.
Pokud ani to nepomůže tak bych zkusil RichTextBox, kde ho můžeš dát disabled, a pak dát písmo zase na černé.
Ahoj. Díky za info. Mohl bys to lépe popsat?? SelectionChanged je event přímo textBoxu? Nikde ho nemohu najít. Díky
Tak jsem zkusil ten richtextbox a event SelectionChanged a stejně tam občas
problikne to označení
Nenapadá tě ještě jiná možnost? Nebo se holt budu muset spokojit s
občasným probliknutím. Díky
No, pokud to nepůjde nějakou jednoduchou vlastností, tak to určitě
půjde tak, že nějak předefinuješ metodu klikání v tom textboxu, tak že
tydle události ani nenastanou. Ale to už je nad mé schopnosti
No tak to už je taky mimo moje schopnosti Tak to asi budu muset nechat tak
jak to je. Díky za info a pomoc.
Třeba se tu někdo ozve, je tu spousta dobrých .NETářů
Čau, nevím jestli ti to pomůže, ale jednou jsem to potřeboval u jednoho políčka a obečel jsem to tak, pokud si dobře vzpomínám, že jsem místo textBox použil textBlock a tam už je nějaká vlastnost (teď si nevybavuji která), jíž zakážeš čtení.
A chceš do toho textboxu psát? Pokud ano, tak ti asi nejlepší řešení je s RichTextBoxem a SelectionChanged eventem, pokud ale ne, můžeš si vytvořit svoji vlastní kontrolku, kde budeš mít panel s Dock na Fill, AutoScroll na true a label. Labelu v kostruktoru kontrolky nastavíš maximální šířku na šířku controlky/panelu mínus šířka Scrollu (myslím, že to je 10px, ale nejsem si úplně jistý, to budeš muset odzkoušet sám).
Nezapomeň, že pokaždé kdy budeš měnit styl kontrolky, budeš muset projekt rebuildnout, jinak ti bude visual studio házet erory.
Ještě zkus změnit barvu výběru na barvu pozadí. Mně to pak neproblikává.
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
richTextBox1.SelectionBackColor = richTextBox1.BackColor;
richTextBox1.Select(richTextBox1.SelectionStart, 0);
}
Tak nevím co dělám špatně, ale když se snažím v richtextboxu označit
text stejně mi tam občas problikne světle modré označení textu...
Díky
Tak mi to dělá jen při označování myší na klávesnici je to vpoho.
Ahoj, psát do něj nepotřebuji. Zkusil jsem si vytvořit vlastní kontrolku
jak jsi psal. Vložil jsem panel a do něj label. Panelu jsem nastavil
autoscroll na true. Labelu jsem dal autosize na true a nastavil jsem minimum
size (kde jsem odečetl scroll). Pokud teď vložím do labelu text, který se
mi vejde na šířku labelu a obsahuje enter viz. obr horní obrázek. Tak to
funguje dobře a text se roluje.
Pokud ale vložím dlouhý text který je bez enteru, tak se mi objeví
horizontální scroll viz obr dolní obrázek a to nechci. Chci aby se objevoval
vždy jen vertikální scroll a text to automaticky odřádkovávalo (tak jak to
je u normálního labelu).
Ještě jsem se chtěl zeptat lze nějak zobrazit scroll natrvalo, aby když je
prázdný label byl zobrazen?
Díky
pokud se spokojíš s laickým řešením:
public Form1()
{
InitializeComponent();
//do panelu pane1 jsem vložil na pozici 0 0 label label1
label1.AutoSize = true;
UpdateSize();
}
private void UpdateSize()
{
panel1.AutoScroll = false;
Size maxsize = label1.MaximumSize;
maxsize.Width = panel1.Width - 2 - SystemInformation.VerticalScrollBarWidth;
label1.MaximumSize = maxsize;
Size ss = panel1.AutoScrollMinSize;
ss.Height = panel1.Height - 1;
panel1.AutoScrollMinSize = ss;
panel1.AutoScroll = true;
}
private void panel1_SizeChanged(object sender, EventArgs e)
{
UpdateSize();
}
private void label1_TextChanged(object sender, EventArgs e)
{
UpdateSize();
}
někdy tam může problikávat horizontální scrollbar. Lepší, ale složitější řešení by bylo napsat vlastní kontrolku a v ní vše vychytat nebo ten text kreslit graficky a nebo použít WPF.
Mimochodem proč ti vadí, že text může někdo označit?
Aby se label neroztáhnul přes šířku kontrolky, musíš mu nastavit maximální ne minimální šířku mínus scroll. A s těmy scrolly, na to se ještě musim podívat, tam to je trochu složitější. Momentálně jsem trochu zaneprázdněný tak mi to chvilku zabere.
Tak jsem konečně přišel na to, jak nechat scroll viditelný, ikdyž bude label prázdný. S panelem a AutoScrollem nastaveným na true to nepůjde. Hledal jsem na netu a nenašel jsem žádné vhodné a jednoduché vysvětlení. Budeš muset vyměnit panel za VerticalScrollBar. V konstruktoru kontrolky mu nastavíš
vScrollBar1.Maximum = label1.Height; // do maximálního rozsahu mu vložíš výšku labelu
vScrollBar1.LargeChange = Height; // a do LargeChange výšku kontrolky
pak odchytíš event VerticalScrollBar.Scroll, kde budeš posouvat labelem:
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
label1.Location = new Point(label1.Location.X, -e.NewValue);
}
Ahoj, tak pokud dám labelu maximální šířku mínus scroll, tak mi teď vůbec nefunguje scroll a ani se nezobrazí, viz. obr. Díky
A jak to máš teď udělané? S panelem nebo jenom se samotným scrollem? Nebo asi nejlepší bude, když sem hodíš zdroják.
Teď to mám udělaný s panelem a vněm label, kterému jsem ve vlastnostech nastavil maximální šířku mínus scroll. Ve zdrojáku formu skoro nic nemám všechny tyto vlastnosti jsem nastavil ve vlastnostech dané komponenty (label, panel).
Udělej to takto: dej si tam panel, do panelu hoď label na pozici 0;0, použij tento kód:
public Form1()
{
InitializeComponent();
//do panelu panel1 jsem vložil na pozici 0 0 label label1
label1.AutoSize = true;
panel1.Resize += UpdateSize;
label1.TextChanged += UpdateSize;
Load += UpdateSize;
}
private void UpdateSize(object sender, EventArgs e)
{
Size maxsize = label1.MaximumSize;
maxsize.Width = panel1.Width - 3 - SystemInformation.VerticalScrollBarWidth;
label1.MaximumSize = maxsize;
Size ss = panel1.AutoScrollMinSize;
ss.Height = panel1.Height - 1;
panel1.AutoScrollMinSize = ss;
}
v designeru nemusíš nic nastavovat.
Vyzkoušej to, třeba ti to bude stačit.
Vzhledem k tomu, že ti to blbne a že jsem zjistil, že druhá možnost se samotným scrollbarem úplně nefunguje jak má, tak jsem ji trochu vylepšil a teď by vše mělo jít správně. Tady je postup:
private void label1_TextChanged(object sender, EventArgs e)
{
SetScrollBarPropts();
vScrollBar1.PerformLayout(); // updatuje layout ve scrollu, kdyby jsi to tu nechal a stalo by se ti, ze scrollem dojedes az na konec dlouheho textu a pak zkratil text nebo ho smazal, label zustane v predchozi poloze
UpdateLabelLocation();
}
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
UpdateLabelLocation();
}
private void SetScrollBarPropts()
{
vScrollBar1.Maximum = label1.Height;
vScrollBar1.LargeChange = Height;
}
private void SetLabelPropts()
{
Size maxSize = new Size();
maxSize.Width = Width - vScrollBar1.Width;
label1.MaximumSize = maxSize;
}
private void UpdateLabelLocation()
{
label1.Location = new Point(label1.Location.X, -vScrollBar1.Value);
}
public override string Text
{
get
{
return label1.Text;
}
set
{
label1.Text = value;
}
}
A je to. Snad jsem na nic nezapomněl, kdyby ti něco nefungovalo, napiš.
Je nějaký důvod, proč nepoužít rovnou label?
Ahoj, label bych rád použil, ale potřebuji abych tam měl vertikální
scroll. Protože ten label může mít maximální velikost, ale vložený text
do něj může být delší. Tak aby mohl uživatel rolovat. A chtěl bych tam
mít scroll trvale zobrazen
To už mi poradil HONZ4 a D0ll0k, teď to akorát zkouším. Jen jsem zjistil, že scroll není na trvalo zobrazen...
Vertical/HorizontalScroll.Visible = true; u panelu
To právěže nefunguje, proto jsem nahoře napsal postup jak si vytvořit kontrolku, kde ten scrollbar bude vždy viditelný
Něco asi dělám blbě, ale mě to normálně funguje, jen stačí panelu
nastavit autoscroll na true
Opravdu? A kde to nastavuješ v konstruktoru? A máš ten label prázdný nebo aspoň krátký na tolik aby nebyl vyšší než panel?
Na formu mám hozenej panel, na něm label, u panelu autoscroll v designeru na True a pak všechno volám v onload
private void Form1_Load(object sender, EventArgs e)
{
panel1.HorizontalScroll.Visible = true;
panel1.VerticalScroll.Visible = true;
var r = new Random();
string str = "";
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 200; i++)
{
str += (char)r.Next(32, 64);
}
str += Environment.NewLine;
}
label1.Text = str;
}
hm, ono fakt ty scrollbary zmizej, když zkrátíš text
Každopádně k čemu tam jsou potřeba scrollbary, když ten text nebude tak
dlouhej?
v mém příkladu je scrollbar vždy viditelný
(pro jistotu smaž tvůj panel s labelem a vlož nový ať máš vše
defaultní, a musí to fungovat)
Bude to pak vypadat jako na obrázku:
(d/t)
Můžu trošku prosím odbočit a zeptat se na jednu věc?
Proč vlastně chceš aby to nešlo označit? Právě naopak mi přijde zcela
logické aby to označit šlo, uživatelé běžně chtějí kus dat zkopírovat
do texťáku do emailu apod. Nevidím důvod proč jim to znemožňovat
Můžeš V aplikaci
používám několik formů a vtomto formu je to pouze zobrazovač s pevnou
šířkou a výškou. Pokud uživatel klikne na tlačítko upravit otevře se
nový form kde jsou textBoxy a tam uživatel upravuje text (může vkládat,
mazat, kopírovat, ...)
No to je sice fajn, ale pořád to není důvod zakazovat aby si to někdo
zkopíroval přímo bez toho aniž by musel lést do dalšího okna, ne?
No ale v tom formu co je jako zobrazovací mám jen labely (protože do ostatních se vkládá jen krátký text nebo přes comboBoxy předvolené nabíky) a z těch nejde kopírovat. Takže by vypadalo blbě pokud bych mohl kopírovat jen z jednoho prvku (a předělávát vše na textBoxy nechci). Navím mám speciální formulář pro editaci, takže v zobrazovacím formu nechci možnost kopírování textu.
Fajn no Já jen vím, že
někdy jako uživatel právě nemám rád jak odněkud nemůžu něco
zkopírovat
Ahoj, tak nevím co dělám špatně. Založím nový projekt vložím panel
a do něho label. Vložím kód co jsi napsal. Dále si vložím dvě
tlačítka. Jedno tlačítko vloží do labelu dlouhý text (na několik
řádek) a druhé tlačítko vloží do labelu krátký text (na jednu řádku).
A když spustím aplikaci tak tam scroll není a když dám vložit dlouhý text
tak se objeví, ale když dám krátký tak zase zmizí.
Zkoušel jsem dát do konstruktoru formu:
panel1.VerticalScroll.Visible = true;
tak se objeví scroll při spuštění, ale při vložení krátkého textu
zase zmizí. Viz obrázek.
Jinak to funguje suprově...
Kvůli tomu mizení scrollu jsem nahoře napsal vlastní kontrolku, kde ten scroll bude VŽDY viditelný.
panel1.VerticalScroll.Visible = true;
Nefunguje.
tady máš ke stažení projekt, včetně aplikace u mě to funguje tak jak chceš..
(testováno na Windows 10 a Vista)
Nechci tě nějak shazovat, ale pokud vím, tak label nemůže dostat focus pouhým poklikáním viz: Label (úplně dole v poznámkách, druhý odstavec), tím pádem z něj nemůžeš nic kopírovat. Způsob jak na label dostat focus je:
label.Focus();
pak když na formu nastavíš KeyPreview na true a odchytíš KeyDown event, kde zkontroluješ, jestli jsi zmáčknul kombinaci CTRL+C, můžeš do Clipboardu uložit text z labelu a považovat to za kopírování.
zkusil sis to někdy?
Dej si na formulář label, spusť aplikaci, poklepej na label a zjisti co máš
ve schránce.
(Platí to pro windows Vista a novější)
Ajo, máš pravdu, pokud na to poklikám, dostane se to do schránky. Tak zbývá ještě možnost vykreslení textu nebo nastavení prázdného textu do schránky
Hlavně nechápu co je vedlo k tomu, aby label měl tuhle funkci.
Teď koukám, má to i LinkedLabel a vsadím se, že to nejsou jediné dvě kontrolky, co mají tuhle funkci. Taky jsem se dočetl, že to přidal nějaký Windows Shell programátor ve Vistech bez toho, aniž by někoho upozornil a pak se o tom dozvěděl Framework team až v sedmičkách. Vzhledem k tomu, že to je bug a že tam byl příliš dlouho, tak se to báli odstranit a nechali ho tam.
Zobrazeno 50 zpráv z 60.