8

Мы внедрили новые стандарты кодирования, которые требуют, чтобы наши частные члены имели лидирующий символ подчеркивания. Как так:Можете ли вы изменить генерацию кода дизайнера VS Win Forms?

private System.Windows.Forms.Label _label; 

К сожалению, VS будет гасить по умолчанию ниже, когда вы перетащите новый ярлык на форму:

private System.Windows.Forms.Label label1; 

Есть ли способ, чтобы изменить значение по умолчанию для:

private System.Windows.Forms.Label _label1; 

Это относится ко всем элементам управления, а не только к меткам, и да, они должны использоваться из кода.

Приветствия,

Пламен

+6

Несомненно, вы все равно меняете имя по умолчанию ... – Paddy

+0

Да, но так оно и есть, оно должно быть _labelContactName, поэтому мы должны добавить его в конец имени. Переход к началу добавления подчеркивания, хотя и не огромная сделка, кажется пустой тратой. Кроме того, люди не делают это последовательно, и я полагаю, что это улучшится, если у дефолта был знак подчеркивания. –

+0

Метка будет доступна из кода. Наверное, на данный момент я защищаю вопрос только по вопросам улучшения согласованности :). –

ответ

3

Помимо создания собственного VS-надстройки, которое наблюдает за сгенерированным кодом и автоматически переименовывает его, нет способа выполнить то, что вы хотите.

1

Этот ответ может быть неудовлетворительным, но это лучшее, что я могу предложить.

Я не думаю, что вы можете заставить Visual Studio Designer автоматически добавить подчеркивание. Однако вы можете сделать процесс добавления подчеркивания менее болезненным. Сначала создайте свои объекты без подчеркивания; затем используйте функцию Refactor, чтобы переименовать их. Просто поместите курсор на имя поля (label1, в вашем случае) и нажмите F2 (или щелкните правой кнопкой мыши ⇒ Refactor ⇒ Rename). Это работает независимо от того, где в коде вы находитесь, все, что вам нужно, это упоминание о label1. Поскольку вы, вероятно, будете писать код, который использует ваши элементы управления, вы, вероятно, будете ссылаться на поля в любом случае. Вы также можете нажать F12, чтобы сразу перейти к объявлениям, где вы фактически получите полный список всех ваших элементов управления; вы можете легко использовать F2 для переименования многих из них туда за один раз.

Кстати, я также использую F2 для переименования большей части автоматически созданных имен обработчиков событий. Например, мне не нравятся имена методов, такие как btnZoomIn_Click(). Я предпочитаю вызывать метод zoomIn(), потому что это то, что он делает. Вместо Mainform_KeyPress() Я мог бы назвать это processKeyPress().

+0

Спасибо за ответ, Timwi, мне известно о рефакторинговых возможностях VS. Изменение имени во время разработки намного быстрее, чем выполнение кода, я подозреваю, что он оптимизирован. Выполнение этого кода компилирует все ваши сборки даже для рядовых по любой причине. Я ищу то, что я могу установить и забыть, и не требовал бы постоянного обслуживания/человеческой работы. –

0

Вы можете установить для GenerateMember значение false.
Это не решит вашу проблему, но избегайте неправильного наименования, когда вы не работаете с управлением вручную.

0

Resharper может применять соглашения об именах. Тогда это просто вопрос открытия файла .designer и нажатия Alt + Enter, введите несколько раз.

11

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

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

+2

Согласен. Если вы попытаетесь приручить автоматически сгенерированный код, вы никогда не получите ничего результативного. Это может быть «просто» код конструктора WinForms сегодня, но завтра вам, возможно, придется иметь дело с клиентами WCF, картированием Entity Framework и, возможно, даже с монстрами, такими как ANTLR. Лекс прав, автоматически сгенерированный код должен быть исключен из этих требований. –

0

Как сказал BlueRaja, вы можете использовать Resharper. Затем вы можете использовать его очистку кода (Ctrl-E, C), однако это не работает с сгенерированными файлами, поэтому вам придется временно переименовать его. Я не работаю, поэтому я не могу проверить, есть ли опция для опции для сгенерированных файлов где-нибудь.

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

2

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

using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

namespace WindowsFormsApplication1 
{ 
    [Designer(typeof(BaseFormDesigner), typeof(IRootDesigner))] 
    public class BaseForm : Form 
    { 
     public BaseForm() 
     { 
     } 
    } 

    public class BaseFormDesigner : DocumentDesigner 
    { 
     public override void Initialize(IComponent component) 
     { 
      base.Initialize(component); 
      var service = GetService(typeof(IComponentChangeService)) as IComponentChangeService; 
      service.ComponentAdded += service_ComponentAdded; 
     } 

     private void service_ComponentAdded(object sender, ComponentEventArgs e) 
     { 
      if (e.Component is Control && !(e.Component is Form)) { 
       var control = (Control)e.Component; 
       if (!control.Name.StartsWith("_")) { 
        var service = GetService(typeof(IComponentChangeService)) as IComponentChangeService; 
        PropertyDescriptor desc = TypeDescriptor.GetProperties(control)["Name"]; 
        service.OnComponentChanging(e.Component, desc); 
        string oldValue = control.Name; 
        string newValue = "_" + oldValue; 
        desc.SetValue(control, newValue); 
        service.OnComponentChanged(e.Component, desc, oldValue, newValue); 
       } 
      } 
     } 
    } 
} 

А затем измените базовый класс формы от формы к BaseForm:

using System; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : BaseForm 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Закрыть любую форму дизайнеров до перекомпиляции проекта, а затем открыть его и попробовать добавить контроль , его имя начнется с подчеркивания.