2011-11-21 9 views
12

Zajmuję się tworzeniem WinForm i potrzebuję checklistbox. Mam wartości przechowywane w obiekcie, który ma właściwość listy:Jak to się dzieje, że checklistbox nie ma źródła danych? jak powiązać listę wartości?

public static class Fields 
{ 
    public static IList<string> FieldList { get; set; } 

    static Fields() 
    { ...//populate FieldList } 
} 

Teraz chciałbym moją CheckedListBox używać jako źródła danych Fields.FieldList. Po przeszukaniu w trybie online okazało się, że potrzebuję ustawić

Ale myCheckedListBox nie ma właściwości DataSource.

Czy tu czegoś brakuje?

Odpowiedz

14

Per dokumentacji, powinien mieć tę właściwość ... http://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.datasource(VS.90).aspx

Jednakże, miałem również ten sam problem w projekcie, natomiast tył, i wykorzystywane this CodeProject article zakodować rozwiązanie w jednym projekcie, gdzie potrzebne ta cecha.

Badanie nieco więcej, znalazłem to:

http://connect.microsoft.com/VisualStudio/feedback/details/115199/checkedlistbox-datasource-displaymember-valuemember-are-hidden

Edycja: Powyższy związek nie jest już działa, ale poniżej exceprt pochodzi z artykułu, który kiedyś mieszkał tam.

Wysłany przez Microsoft w dniu 5/30/2005 10:28
Dzięki za opinie jednak jest to zgodne z projektem. Nie obsługujemy wiązania danych dla formantu CheckedListBox . Te właściwości są dziedziczone z klasy podstawowej i nie można ich usunąć, więc ukryliśmy je z siatki właściwości i IntelliSense.

To wyjaśnia, dlaczego właściwość istnieje, ale nie jest wyświetlana w IntelliSense.

Ten blogu warto przeczytać także: http://waxtadpole.wordpress.com/2009/10/12/assigning-custom-class-to-checkedlistbox-datasource/

+1

Dzięki. Znalazłem linki, które wysłałeś, ale odkąd zobaczyłem artykuły, w których ludzie korzystali z tej nieruchomości, ... To jest dziwne ... Dzięki, przynajmniej wiem, że ktoś inny miał ten problem. – nche

+0

Ps: nie ma dokumentacji dotyczącej sposobu użycia przedmiotu. Jestem nowy w winform dev (właśnie zaczął dzisiaj), czy mógłbyś mi powiedzieć, jak udostępnić ten element w projektancie VS? ... – nche

+0

Nie sądzę, że możesz, chyba że stworzyłeś własną klasę, która nadpisuje klasę CheckBoxList . W nowszych projektach po prostu nie użyłem formantu, a zamiast tego korzystałem z DataGridView w rzadkich przypadkach, gdy naprawdę potrzebowałem móc pojedynczo sprawdzać elementy. Jeśli DataSource ma pole bitowe, DataGridView automatycznie wyrenderuje je jako checkboxcolumn, a jeśli nie, to wolę dodać kolumnę DataColumn typu Boolean, aby uzyskać ten sam efekt. – David

2

ten można obejść przez iteracja swojej niedoszłej źródłem danych i dodanie jej elementy jeden w swoim czasie. Na przykład:

To, co spowoduje wyjątek:

myCheckedListBox.DataSource = myStringList; 

można modyfikować do tego:

foreach (string myString in myStringList) 
{ 
    myCheckedListBox.Items.Add(myString); 
} 
4

Oto jak ja wiązania List<T> z User przedmiotów do CheckedListBox.

((ListBox)myCheckedListBox).DataSource = listOfUsers; 
((ListBox)myCheckedListBox).DisplayMember = "FullName"; 
((ListBox)myCheckedListBox).ValueMember = "UserID"; 

Oczywiście nie jest to zalecane, ponieważ dokumentacja mówi nam, że ten obiekt jest ukryty.

Powyższy kod działa, ale zauważyłem pewne skutki uboczne w Visual Studio 2012, takie jak:

opóźnienie renderowania sprawdzony marker:

Po kliknięciu na wybraną pozycję, jest irytujące opóźnienia renderować znacznik "zaznaczony".

W moim przypadku, właściwość CheckOnClick jest prawdziwa, CausesValidation jest fałszywa.

+0

No cóż, trzymam się 'myCheckedListBox.Items.Add()', ponieważ powyższe obejście działa dziwnie. –

1

Wiem, że jest dość stary; dla dobra każdego, kto wciąż ma ten sam wymóg, oto, co dla mnie zadziałało. Zauważ, że nie użyłem właściwości DisplayMember lub ValueMember, ponieważ wygląda na to, że jest odradzane (patrz @David Stratton's post powyżej).

//References 
// https://social.msdn.microsoft.com/Forums/vstudio/en-US/0e0da0c9-299e-46d0-b8b0-4ccdda15894c/how-to-assign-values-to-checkedlistbox-items-and-sum-these-values?forum=csharpgeneral 


using Microsoft.Practices.EnterpriseLibrary.Data; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Windows.Forms; 

namespace MyApp 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
     Database db = factory.Create("MyConnString"); 
     DataTable dt = db.ExecuteDataSet(CommandType.StoredProcedure, "ProcGetCustomers").Tables[0]; 
     var custlist = new List<CheckBoxItem<string, string>>(); 
     for (int i = 0; i < dt.Rows.Count; i++) 
     { 
      custlist.Add(Create(dt.Rows[i]["DESC"].ToString(), dt.Rows[i]["CODE"].ToString())); 
     } 
     checkedListBox1.Items.AddRange(custlist.Cast<object>().ToArray()); 


    } 
    public class CheckBoxItem<K, V> 
    { 
     public CheckBoxItem(K displayValue, V hiddenValue) 
     { 
      DisplayValue = displayValue; 
      HiddenValue = hiddenValue; 
     } 

     public K DisplayValue { get; private set; } 
     public V HiddenValue { get; private set; } 


     public override string ToString() 
     { 
      return DisplayValue == null ? "" : DisplayValue.ToString(); 
     } 
    } 
    public static CheckBoxItem<K, V> Create<K, V>(K displayValue, V hiddenValue) 
    { 
     return new CheckBoxItem<K, V>(displayValue, hiddenValue); 
    } 
    } 
} 
2

Osobiście używam DataGridView, który jest związany z DataTable który ma logiczną pole wraz z polem o wartości wyświetlacza.

Jeśli ukryjesz nagłówki kolumn i nagłówki wierszy, otrzymasz coś bardzo zbliżonego do tego, co daje CheckedListBox.

0

I rozwiązać problem poprzez zmianę metody toString() do nazwy, które powinny pojawić się:

public static class Fields 
{ 
    public string MyDisplayMenber{ get; set; } 

    public override string ToString(){ 
     return MyDisplayMenber; 
    } 
} 

i zamienia listy tablicy z obiektami:

{ 
    mycheckedlistbox.Items.AddRange(MyList.ToArray<Fields>()); 
} 
Powiązane problemy