konto usunięte

Temat: Przyciski w propertygrid

Witam,
Napisałem swojego propertygrida który może mieć własności typu int,string. Jednak chciałbym uzyskać coś takiego że jedna z właściwości jest przyciskiem oczywiście z możliwością obsługi zdarzenia on click i dodawana dynamicznie. Czy ktoś z Was miał z tym tematem już jakąś styczność? Porady przykłady kodu mile widziane zwłaszcza w C#.

Z góry dziękuję
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: Przyciski w propertygrid

Hej,
jak kiedyś też pisałem coś w rodzaju propertygrida. Tamto rozwiązanie było oparte o kontrolkę UltraGridView firmy Infragistics (niestety kontrolki są płatne). Jest ona o tyle fajna że w danej kolumnie każda komórka może przyjmować inną kontrolkę (combobox, checkbox, textbox itp) i dodatkowo każdej komórce mozna wsadzić kilka przycisków. Więc jeżeli możesz nabyć jakieś kontrolki to polecam, jest dołączony do nich przykład nawet jak to zrobić takiego grida.

Jeżeli jest to rozwiązanie oparte o komponenty czysto microsoftu to jeżeli zrobiłeś to na podstawie datagridview to chyba się nie da zrobić tego.

Napisz dokładniej z czego korzystałeś to postaram się pomóc :)

konto usunięte

Temat: Przyciski w propertygrid

Tak jak napisałem, chodzi o kontrolkę którą napisałem i która dziedziczy po kontrolce ms, propertgrid. Nie wiem tylko jak zrobić jakieś property które ma np. przycisk [...] tak jak to jest w kolekcjach ale tak żeby można było obsłużyć własny event jeżeli ktoś kliknie w niego to np wyświetli się hello world albo np otworze w nim np inną maskę. Chodzi o to żeby pokazał się tylko przycisk.

konto usunięte

Temat: Przyciski w propertygrid

Chyba chodzi o to - http://msdn.microsoft.com/en-us/magazine/cc163758.aspx . Ogólnie polecam poszukać o custom Designer'ach i Editor'ach. Musisz dodać otpowiedni atrybuty na klasie którą pokazujesz w PropertyGrid. Wyświetlając właściwości korzysta on z tych atrybutów i dlatego np. jeśli property jest typu Color mamy ładne okienko wyboru koloru. Gdzieś kiedyś widziałem fajny przykład tworzenia takiego, który w Property Gridzie rysowało Smiley face i za pomocą combo pozwalało wybrać inną buźkę. Niestety nie mogę tego odszukać teraz.

konto usunięte

Temat: Przyciski w propertygrid

Udało się :-) pojawił mi się przycisk [...] dodałem coś takiego:

public class ButtonModal : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(
ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
IWindowsFormsEditorService wfes = provider.GetService(
typeof(IWindowsFormsEditorService)) as
IWindowsFormsEditorService;

if (wfes != null)
{
MessageBox.Show("DD");
value = "dd";

}
return value;
}
}

[Editor(typeof(ButtonModal),typeof(System.Drawing.Design.UITypeEditor))]
public class btMW
{
}

Tylko niestety znalazłem inny problem. Ile razy będę dodawał taki przycisk na property grid tyle razy będzie on identyczny czyli za każdym razem będę miał messagebox i "dd". Zauważyłem że przy konwerterze stringów np takim:

[TypeConverter(typeof(StrList))]
public class ListStr
{
}

public class StrList : System.ComponentModel.StringConverter
{
private static List str;
public void SetList(List AList)
{
AList.Sort();
if (str == null)
str = new List();
else
str.Clear();
str = AList;
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(str);
}

public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}

public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}

Zawsze będę miał tą samą listę w property grid. A chciałbym mieć inne. Dodam że to co mi się marzy to, że wszystkie property buduję dynamicznie i np. Jeżeli chcę dodać property z combo to robię to mniej więcej tak:

StrList d = new StrList();
d.SetList(strList);
CustomProperty myProp = new CustomProperty(sName, Value, typeof(ListStr), false, true, bCategory);
myProperties.Add(myProp);

Niestety jeżeli wypełniam odpalam coś takiego dla 3 różnych listy mam wszędzie(3 property) z tą samą ostatnią listę. Nie jestem aż tak biegły w C# ale czy dałoby się zrobić to tak żeby konvertery typów były przypisane do jednego property a nie do całego bez implementacji oddzielnie dla każdego property. A może jakieś inne rozwiązanie.Marcin Woźniak edytował(a) ten post dnia 18.01.09 o godzinie 23:31
Maciej Czerwiakowski

Maciej Czerwiakowski Change Manager @ HP
/ MCPD : Enterprise
Application Devel...

Temat: Przyciski w propertygrid

Paweł Łukasik:
Gdzieś kiedyś widziałem fajny przykład tworzenia takiego, który w Property Gridzie rysowało Smiley face i za pomocą combo pozwalało wybrać inną buźkę. Niestety nie mogę tego odszukać teraz.

Zdaje się widzieliśmy ten sam kawałek kodu :) Też nie mam linka ad hoc, ale należny poszukać na CodeProject pod hasłem Design Time.

konto usunięte

Temat: Przyciski w propertygrid

Nie chodzi mi o budowanie propertygrida w designie. Może być również w runtimie.

konto usunięte

Temat: Przyciski w propertygrid

Temat nadal otwarty ale lekko zmodyfikowany. Stwierdziłem że napiszę sobie własną kontrolkę dziedziczącą po UserControl gdzie jeżeli pole/wiersz jest typu string to wstawiam wiersz z textboxem który jest na panelu itp, analogiczna sytuacja do daty (datetimepicker) listy itp. Problem polega na tym że jak wywołuję metodę np ShowRows(). To widać ewidentnie jak odświeża się kontrolka wszystko się rysuje. Tak więc poszperałem i chyba znalazłem ale nie tak do końca a mianowicie znalazłem SuspendLayout() oraz ResumeLayout() które wykonuję na każdej kontrole którą dodaję do mojej bazowej.
Wygląda to mniej więcej tak że SuspendLayout() odpalam po zainicjowaniu kontrolki ResumeLayout() gdy już wszystko zrobiłem itp. Niestety problem nie zniknął :(
To stwierdziłem że wykorzystam zmienną prywatną typu bool która będzie inicjowana na true jeżeli wszystkie kontrolki zostaną już pokazane (poustawiane) i przeciążę metody/zdarzenia onpaint oraz refresh mojej kontrolki które są uruchamiane dopiero wtedy gdy ta moja zmienna jest na true. Problem nie zniknął. Mam pytanie do osób bardziej zaawansowanych w pisaniu kontrolek pod C# czy jest jakaś możliwość "zamrożenia" kontrolek które są dodawane i dopiero na sam koniec "odmrażam" je i nie widać żadnego rysowania odświeżania itp.
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: Przyciski w propertygrid

z założenia właśnie SuspendLayout powinien to robić, ale sam mam z tym problem ze swoją kontrolką w pracy i jak na razie nie znalazłem na to rozwiązania niestety.

konto usunięte

Temat: Przyciski w propertygrid

Hmmm rozwiązałem to trochę inaczej, niezbyt ładnie ale jeszcze będę walczył.

Rozwiązanie nr 1. : Kontrolkę wypełniam w konstruktorze maski dzięki czemu po pokazaniu maski już wszystko ładnie widać.

Rozwiązanie nr 2. : W kontrolce w tej przykładowej metodzie ShowRows() wykonuje na początku this.Visible=false i analogicznie na końcu true. :D ale widać że się chowa i pojawia w tym rozwiązaniu ale już lepsze to nić takie miganie ;-).

Rozwiązanie nr 3 (nie przetestowane, na razie idea) Może jakby w metodzie ShowRows zrobić coś takiego na początku this.Parent.Suspandlayout() a na końcu this.Parent.ResumeLayout() to by pomogło.

Następna dyskusja:

Problem z Propertygrid i Ty...




Wyślij zaproszenie do