При использовании TreeView, у Node было свойство Tag, которое порой очень выручало... (там например можно хранить id из бд)...
Подскажите как решить аналогичную проблему в comboBox... у Item-ов там нету свойства Tag..
Здравствуйте, SergunRu, Вы писали:
SR>При использовании TreeView, у Node было свойство Tag, которое порой очень выручало... (там например можно хранить id из бд)... SR>Подскажите как решить аналогичную проблему в comboBox... у Item-ов там нету свойства Tag..
Зато у каждого элемента есть Text и Value. Храните id в Value.
Здравствуйте, krasin, Вы писали:
K>Здравствуйте, SergunRu, Вы писали:
SR>>При использовании TreeView, у Node было свойство Tag, которое порой очень выручало... (там например можно хранить id из бд)... SR>>Подскажите как решить аналогичную проблему в comboBox... у Item-ов там нету свойства Tag..
K>Зато у каждого элемента есть Text и Value. Храните id в Value.
Здравствуйте, SergunRu, Вы писали:
SR>Подскажите как решить аналогичную проблему в comboBox... у Item-ов там нету свойства Tag..
ComboBox хранит не строчки! Он хранит что угодно. Создайте свой класс со всеми нужными полями, и храните там что хотите.
Посмотрите в качестве примера Janus\Core\Navigation\NavigationBox.cs — это ComboBox, в котором вместо строцек живут объекты FeatureContainer:
public class NavigationBox : ComboBox
{
private class FeatureContainer
{
public override string ToString()
{
string str = _feature.ToString();
return str == null ? "" : str;
}
}
/// <summary>
/// <see cref="ComboBox.OnDrawItem"/>
/// </summary>protected override void OnDrawItem(DrawItemEventArgs e)
{
e.DrawBackground();
if ((Site != null) && Site.DesignMode)
{
e.Graphics.DrawString("<design mode>", Font, Brushes.Gray, 0, 0);
}
if (e.Index >= 0)
{
Rectangle nb = e.Bounds;
FeatureContainer cont = (FeatureContainer)Items[e.Index];
e.Graphics.DrawString(cont.Feature.ToString(),
!ni.Highlight ? Font : new Font(Font, FontStyle.Bold),
(e.State & DrawItemState.Selected) == 0 ? SystemBrushes.ControlText :
SystemBrushes.HighlightText, nb);
}
}
private void FillFeatures(ITreeNode feature, int level)
{
foreach (IFeature f in feature)
{
Items.Add(new FeatureContainer(f, level));
if (f.HasChildren)
FillFeatures(f, level + 1);
}
}
}
Обратите внимание на выделенную строку: в Items помещаются объекты типа FeatureContainer, в OnDrawItem извлекаются и отрисовываются.
Можно, кстати, обойтись и без отрисовки вручную. В данном случае она просто использовалась для рисования иконок
Сейчас борюсь с аналогичной проблемой, но при реализации предложенного способа возникли ошибки, вот мой код:
struct cmbData
{
public string name;
public string field;
public cmbData(string Aname, string Afield) {
name = Aname;
field = Afield;
}
}
// кусок кода из функции:
ArrayList arr = new ArrayList();
this.cbColumnSearch.Items.Clear();
if (this.gvFirm.ColumnCount > 0)
{
foreach (DataGridViewColumn CurrentColumn in this.gvFirm.Columns)
{
cmbData cmb = new cmbData(CurrentColumn.HeaderText,CurrentColumn.DataPropertyName);
arr.Add(cmb);
//this.cbColumnSearch.Items.Add(CurrentColumn.HeaderText);
}
cbColumnSearch.DataSource = arr;
cbColumnSearch.DisplayMember = "name";
cbColumnSearch.ValueMember = "field"; // здесь вот и вылетает проблема, то есть появляется ошибка:
//Cannot bind to the new display member.
//Parameter name: newDisplayMember
Здравствуйте, vladsoft, Вы писали:
V>Сейчас борюсь с аналогичной проблемой, но при реализации предложенного способа возникли ошибки, вот мой код: V>
V>struct cmbData
V> {
V> public string name;
V> public string field;
V> public cmbData(string Aname, string Afield) {
V> name = Aname;
V> field = Afield;
V> }
V> }
V>// кусок кода из функции:
V>ArrayList arr = new ArrayList();
V> this.cbColumnSearch.Items.Clear();
V> if (this.gvFirm.ColumnCount > 0)
V> {
V> foreach (DataGridViewColumn CurrentColumn in this.gvFirm.Columns)
V> {
V> cmbData cmb = new cmbData(CurrentColumn.HeaderText,CurrentColumn.DataPropertyName);
V> arr.Add(cmb);
V> //this.cbColumnSearch.Items.Add(CurrentColumn.HeaderText);
V> }
V> cbColumnSearch.DataSource = arr;
V> cbColumnSearch.DisplayMember = "name";
V> cbColumnSearch.ValueMember = "field"; // здесь вот и вылетает проблема, то есть появляется ошибка:
V>//Cannot bind to the new display member.
V>//Parameter name: newDisplayMember
V>
V>В чем проблема? V>
Попробуй так:
V>
V>class cmbData
V> {
V> public string name;
V> public string field;
V> public cmbData(string Aname, string Afield) {
V> name = Aname;
V> field = Afield;
V> }
public string Name
{
get { return name; }
}
public string Field
{
get { return field; }
}
V> }
V>// кусок кода из функции:
V>ArrayList arr = new ArrayList();
V> this.cbColumnSearch.Items.Clear();
V> if (this.gvFirm.ColumnCount > 0)
V> {
V> foreach (DataGridViewColumn CurrentColumn in this.gvFirm.Columns)
V> {
V> cmbData cmb = new cmbData(CurrentColumn.HeaderText,CurrentColumn.DataPropertyName);
V> arr.Add(cmb);
V> //this.cbColumnSearch.Items.Add(CurrentColumn.HeaderText);
V> }
V> cbColumnSearch.DataSource = arr;
cbColumnSearch.DisplayMember = "Name";
cbColumnSearch.ValueMember = "Field"; // здесь вот и вылетает проблема, то есть появляется ошибка:
V>//Cannot bind to the new display member.
V>//Parameter name: newDisplayMember
V>
Styx
Re: Проблема с ComboBox
От:
Аноним
Дата:
22.08.05 20:21
Оценка:
Еще можно хранить объекты своего тип или вообще, унаследоваться от Combo и расширить возможости