Получите родительскую форму компонента

WebAPI v2.1 и выше поддерживает BSON (двоичный JSON) из коробки и даже имеет MediaTypeFormatter, включенный для него. Это означает, что вы можете опубликовать все свое сообщение в двоичном формате.

Если вы хотите его использовать, вам нужно установить его в WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Formatters.Add(new BsonMediaTypeFormatter());
    }
}

Теперь, вы используете тот же BsonMediaTypeFormatter на стороне клиента для сериализации вашего запроса:

public async Task SendRequestAsync()
{
    var client = new HttpClient
    {
        BaseAddress = new Uri("http://www.yourserviceaddress.com");
    };

    // Set the Accept header for BSON.
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/bson"));

    var request = new SomePostRequest
    {
        Id = 20,
        Content = new byte[] { 2, 5, 7, 10 }
    };

    // POST using the BSON formatter.
    MediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
    var result = await client.PostAsync("api/SomeData/Incoming", request, bsonFormatter);

    result.EnsureSuccessStatusCode();
}

Или вы можете использовать Json.NET для сериализации вашего класса в BSON. Затем укажите, что вы хотите использовать «application / bson» в качестве вашего «Content-Type»:

public async Task SendRequestAsync()
{   
    using (var stream = new MemoryStream())
    using (var bson = new BsonWriter(stream))
    {
        var jsonSerializer = new JsonSerializer();

        var request = new SomePostRequest
        {
            Id = 20,
            Content = new byte[] { 2, 5, 7, 10 }
        };

        jsonSerializer.Serialize(bson, request);

        var client = new HttpClient
        {
            BaseAddress = new Uri("http://www.yourservicelocation.com")
        };

        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/bson"));

        var byteArrayContent = new ByteArrayContent(stream.ToArray());
        byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/bson");

        var result = await client.PostAsync(
                "api/SomeData/Incoming", byteArrayContent);

        result.EnsureSuccessStatusCode();
    }
}

25
задан Pondidum 16 December 2008 в 14:48
поделиться

5 ответов

[Важно понять, что техника ISite ниже только работает во время проектирования. Поскольку ContainerControl общедоступен и присвоен значение, VisualStudio запишет код инициализации, который устанавливает его во времени выполнения. Сайт установлен во времени выполнения, но Вы не можете добраться, ContainerControl от него]

Вот статья , которая описывает, как сделать это для невидимого компонента.

В основном необходимо добавить свойство ContainerControl к компоненту:

public ContainerControl ContainerControl
{
  get { return _containerControl; }
  set { _containerControl = value; }
}
private ContainerControl _containerControl = null;

и переопределение свойство Site:

public override ISite Site
{
  get { return base.Site; }
  set
  {
    base.Site = value;
    if (value == null)
    {
      return;
    }

    IDesignerHost host = value.GetService(
        typeof(IDesignerHost)) as IDesignerHost;
    if (host != null)
    {
        IComponent componentHost = host.RootComponent;
        if (componentHost is ContainerControl)
        {
            ContainerControl = componentHost as ContainerControl;
        }
    }
  }
}

, Если Вы делаете это, ContainerControl будет инициализирован для ссылки на содержание формы разработчиком. Связанная статья объясняет его более подробно.

А хороший способ видеть, как сделать, вещи состоят в том, чтобы посмотреть на реализацию Типов в Платформе.NET, которые имеют поведение, подобное тому, что Вы хотите с инструментом, таким как Отражатель Лутца. В этом случае, Система. Windows. Формы. ErrorProvider является хорошим примером для взгляда на: Компонент, который должен знать его содержание Формы.

27
ответ дан Michael Foukarakis 15 October 2019 в 16:32
поделиться

Я использую рекурсивный вызов для хождения по цепочке управления. Добавьте это к своему управлению.

public Form ParentForm
{
    get { return GetParentForm( this.Parent ); }
}

private Form GetParentForm( Control parent )
{
    Form form = parent as Form;
    if ( form != null )
    {
        return form;
    }
    if ( parent != null )
    {
        // Walk up the control hierarchy
        return GetParentForm( parent.Parent );
    }
    return null; // Control is not on a Form
}

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

Сохраняют родительское управление как участника и затем используют его в свойстве ParentForm, которое я дал Вам выше вместо этого.

9
ответ дан Rob Prouse 15 October 2019 в 16:32
поделиться

Необходимо будет установить родительский контейнер некоторые как. Ваш компонент является просто классом, который находится в памяти точно так же, как все остальное. Это не имеет никакого истинного контекста того, что создало его, если что-то не говорит Вам, что сделало. Создайте Родительское свойство элемента управления и установите его.

Или просто происходят из управления и используют FindForm (). Не все средства управления должны иметь видимый компонент

3
ответ дан Brian Rudolph 15 October 2019 в 16:32
поделиться

Если componenet справляется с другими визуальными средствами управления, то необходимо быть в состоянии добраться до родителя через них.

2
ответ дан BFree 15 October 2019 в 16:32
поделиться

Я думаю, что Вы хотите использовать свойство Site IComponent. Это - более или менее эквивалент свойству Parent.

1
ответ дан arul 15 October 2019 в 16:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: