Невозможно изменить выражение, потому что оно не является переменной - PullRequest
6 голосов
/ 15 апреля 2009

Я пытаюсь получить UserControl (на котором есть сетка) в форме Windows для изменения размера. Ниже приведен код, который я имею в форме. Поведение, которое я получаю, заключается в том, что размер элемента управления изменяется, когда я его увеличиваю. Но это не сжимается. Что я делаю не так (или) Что мне не хватает?

private void AdjustGrid()
{
    ZoomControl.Location = new Point(5, 5);
    ZoomControl.Size = new Size(this.Width - 15, this.Height - 75);
}

void zoomform_Resize(object sender, EventArgs e)
{
    AdjustGrid();
}

Теперь пользовательский элемент управления имеет следующий код:

//Resize the grid that the UserControl has on it
private void NameValuePropertyBag_Resize(object sender, EventArgs e)
{
    grdNameValueProperties.Location = new Point(4,4);
    grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8);
}

Я пытался

grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;

Это выдает мне сообщение "Невозможно изменить выражение, потому что оно не является переменной" ... Чего мне не хватает?

Дополнительная информация:

Я использую функцию Windows SetParent () для перемещения / масштабирования UserControl в другую форму (ZoomForm). Якорь, кажется, не работает для элементов управления, перемещенных с помощью SetParent () ... Точнее, он может работать, но у меня проблемы с перерисовкой.

Я заставил пару Anchor / Dock работать без проблем с перерисовкой [Я удалил проводку события resize и настроил Dock to Fill]

ZoomForm изначально не имеет элементов управления. Usercontrol добавляется в ParentForm динамически.

В настоящее время я могу увеличить зум-форму с помощью приведенного выше кода , но не меньше.

Ответы [ 5 ]

7 голосов
/ 15 апреля 2009
grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;

Этот код выдает ошибку, потому что Size является типом значения, а не ссылочным типом. Чтение этого http://www.yoda.arachsys.com/csharp/parameters.html может помочь объяснить разницу между типами значений и ссылочными типами.

4 голосов
/ 15 апреля 2009

Как рекурсивно прокомментировано, вы должны просто использовать свойство Anchor.

Ошибка возникает из-за того, что свойство Size предоставляет структуру, а не ссылочный тип. Свойство Size возвращает копию объекта размера элемента управления. Запись в свойствах Width и Hight этой копии не имеет смысла, потому что это просто временная копия и нигде не защищена памятью.

1 голос
/ 15 апреля 2009

В настоящее время я могу увеличить масштаб с помощью приведенного выше кода, но не меньше.

Некоторые элементы управления имеют свойство MinSize (или подобное). Есть ли у вас какие-либо из этих наборов, так что вы не можете изменить размер меньше?

1 голос
/ 15 апреля 2009

Вы не можете напрямую изменить свойство Size.Width в UserControl, поскольку свойство Size является типом значения, поэтому изменение его ширины, по существу, приведет к перезаписи всего свойства Size. Вместо этого элементы управления в WinForms предоставляют свои собственные свойства Width и Height, поэтому этот код должен работать:

grdNameValueProperties.Width = this.Width - 8;
grdNameValueProperties.Height = this.Height - 8;

Сказав это, я согласен с комментарием @ recursive о том, что вам, вероятно, следует просто использовать свойство Anchor UserControl, чтобы сделать его "автоматически" изменяющим размер.

0 голосов
/ 15 апреля 2009

Для первой порции -

Прежде всего, я бы рекомендовал использовать свойство Anchor в UserControl вместо того, чтобы пытаться изменить его размер самостоятельно. Он работает очень просто и очень надежно для обработки изменения размера окна.

Если вы хотите сделать это, вам, вероятно, следует рассмотреть цепочку this.ClientSize вместо this.Height и this.Width. Вероятно, вы устанавливаете слишком большой элемент управления, и это не касается панели или другой вещи, на которой вы сидите, что вызывает все виды проблем.

Вторая часть связана с тем, что gridNameValue Properties.Size.Width является членом структуры.

Когда вы вызываете gridNameValueProperties.Size, вы возвращаете структуру Size, а затем пытаетесь установить ширину возвращаемой структуры (не оригинала). Вот почему вам нужно установить полный тип значения размера в одном кадре. Создание нового Size () и установка его в gridNameValueProperties.Size - единственный способ заставить это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...