Member 13839622 Ответов: 2

Функциональность свойства selectedobject элемента управления propertygrid. С#


I'm creating a usercontrol and I want to replicate the SelectedObject property of the .NET PropertyGrid Control.  i.e.... I want the user to be able to select a control, from a list of controls which have been placed on my UserControls' Parent form. They will be selecting the control in the propertygrid inside Visual Studio.  Well, technically, they can manually assign it in code, like you can with the SelectedObject property.


Что я уже пробовал:

Обновление : я добавил Решение, ниже этого вопроса, "Soluton #2

private string[] ObjectBuffer;
private string _SelectedObject = "Unknown";
[Category("Custom"), TypeConverter(typeof(SelectedObjectConverter))]
public string SelectedObject
{
    get { fillit(); return _SelectedObject; }
    set { _SelectedObject = value; }
}

private void fillit()
{
    if (this.Parent == null) return;

    List<string> listBuffer = new List<string>();

    foreach(Control c in (this.Parent as Control).Controls)
    {
        listBuffer.Add(c.Name);
    }

    ObjectBuffer = listBuffer.ToArray();

    listBuffer.Clear();
}

private class SelectedObjectConverter : StringConverter
{
    //This works ....
    //private static StandardValuesCollection SelectedObjects =
    //      new StandardValuesCollection(
    //         new string[]{"Mother", "Father", "Sister",
    //    "Brother", "Daughter", "Son",
    //    "Aunt", "Uncle", "Cousin"});

    //But, how do I access the above ObjectBuffer[]
    private static StandardValuesCollection SelectedObjects =
          new StandardValuesCollection(ObjectBuffer);

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true;
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) => false;

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) => SelectedObjects;
}

OriginalGriff

- Но я уже знаю, как это сделать."

Тогда в чем же проблема?
Где ты застрял?
А что вы пробовали?
Какая помощь вам нужна?

Member 13839622

Я обновил вопрос и добавил пример кода, который только что попробовал.

Member 13839622

Я обновлял и изменял вопрос миллион раз. У меня есть рабочая версия того, что мне нужно. Но он работает только путем ручного создания строки[] внутри класса SelectedObjectConverter. Я не могу получить доступ ни к чему за пределами класса. Поэтому я не могу перебирать элементы управления и строить свою настоящую строку[]. Мне нужна помощь, чтобы разобраться в этом.

2 Ответов

Рейтинг:
11

Member 13839622

Вот не элегантное решение, которое, вероятно, не является лучшим способом сделать это. Если кто-нибудь может одобрить его, пожалуйста, дайте мне знать:

private string _SelectedObject = "Unknown";
[Category("Custom"), TypeConverter(typeof(SelectedObjectConverter))]
public string SelectedObject
{
    get { fillit(); return _SelectedObject; }
    set { _SelectedObject = value; }
}

private void fillit()
{
    if (this.Parent == null) return;

    string[] controlStrings = new string[(this.Parent as Control).Controls.Count];

    for (int i = 0; i < (this.Parent as Control).Controls.Count; i++)
    {
        controlStrings[i] = (this.Parent as Control).Controls[i].Name;
    }

    SelectedObjectConverter.SelectedObjects = new SelectedObjectConverter.StandardValuesCollection(controlStrings);
}

private class SelectedObjectConverter : StringConverter
{
    public static StandardValuesCollection SelectedObjects = new StandardValuesCollection(new string[0]);

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true;
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) => false;

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) => SelectedObjects;
}


Рейтинг:
1

RickZeeland

Вы можете использовать Управления коллекция, смотрите пример здесь: c# - цикл через все элементы управления в форме,даже те, что находятся в групповых полях - переполнение стека[^]


Member 13839622

Эту часть я могу сделать. Я действительно близок к этому. Я опубликовал свой последний фрагмент кода.