Har en listview med kontakter där jag vill att vissa rader inte ska gå att välja (de som är företag, man ska bara kunna välja personer), och dessutom gärna vara "utgråade". Kan du inte använda dig av Groups? Då blir dom indelade så här: http://blogs.vbcity.com/upload/djjeavons/explorer.jpg Tjena Det här kanske är en bit på väg (ursäkta att det är i C#). nackdelen med denna lösning är att du inte kan bläddra förbi ett disablat item i ListBoxen med upp/ner-tangenterna. Mmm, det var ju mitt förslag: Ang "Mmm, det var ju mitt förslag: ", ok, jag förstod nog inte att det var så du menade. Dels får kontrollen inte längre vettigt beteende om man inte också hanterar key-down-eventet, dels är det mycket kod för ganska liten användning, dels är det en hel del debuggande innan man är hyfsat säker på att allt fungerar som det ska.Disabla vissa listviewitems
Jag skulle förstås kunna göra så att jag inte visar företagen alls, men det blir av vissa skäl inte speciellt logiskt.
Kollade lite på om man skulle kunna säga till eventargumenten till typ "SelectedIndexChanged" att "Nä, men skippa att göra det i det här fallet", men kan inte hitta något.
Jag borde ju kunna hålla reda på "senast valda" och alltid byta tillbaka, men det är så jävla omständligt, och är ofta svårt att rensa på buggar. Förslag?Sv: Disabla vissa listviewitems
/ThomasSv: Disabla vissa listviewitems
Det går nog inte att göra med standardlistviewkontrollen. Gå in på codeproject.com och sök efter ListviewEx som är en klart roligare listview med mycket mer funktioner att leka med. Tyvärr så kommer man inte in på codeproject.com just nu... annars hade jag föreslagit en direktlänk.
/DanielSv: Disabla vissa listviewitems
<code>
private void Form1_Load(object sender, EventArgs e)
{
listBox1.DrawMode = DrawMode.OwnerDrawFixed;
//initiera testdata
for (int i = 0; i < 29; i++)
listBox1.Items.Add(i);
}
int mLastSelection = -1;
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ListBox lb = (ListBox)sender;
if ((lb.SelectedItem != null) && (IsEnabledSelection((int)lb.SelectedItem)))
{
//Tillåtet val
mLastSelection = lb.SelectedIndex;
}
else
{
//EJ tillåtet val
lb.SelectedIndex = mLastSelection;
}
}
private void listBox1_DrawItem_1(object sender, DrawItemEventArgs e)
{
// Draw the background of the ListBox control for each item.
e.DrawBackground();
// Define the default color of the brush as black.
Brush myBrush = Brushes.White;
// Determine the color of the brush to draw each item based on the index of the item to draw.
if (!IsEnabledSelection((int)listBox1.Items[e.Index]))
{
//Not Enabled
myBrush = Brushes.LightGray;
}
//Fyll rektangeln (Comboboxen) med lämplig färg, Bakgrund
e.Graphics.FillRectangle(myBrush , e.Bounds);
// Draw the current item text based on the current Font and the custom brush settings.
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
// If the ListBox has focus, draw a focus rectangle around the selected item.
e.DrawFocusRectangle();
}
private bool IsEnabledSelection(int item)
{
return (item % 4) != 0;
}
}
</code>Sv:Disabla vissa listviewitems
"Jag borde ju kunna hålla reda på "senast valda" och alltid byta tillbaka, men det är så jävla omständligt, och är ofta svårt att rensa på buggar."
Jag tror jag skiter i det, och löser det på ett annat sätt, tack ändå.Sv: Disabla vissa listviewitems
Vad är det som är så omständligt?
Gör en klass som sköter det där du skickar in din ListBox som en parameter i konstruktorn så kan du ju använda funktionen för alla dina LB eller så gör du en egen User Control med en LB och den funktionalitet du vill ha.Sv:Disabla vissa listviewitems
Vad jag var ute efter var mer en liten enkel workaround som jag bara inte hade tänkt på. Det är bara en detalj i ett större system, och jag kan lösa det på andra sätt. Men jag ska ha det i åtanke nästa gång.