Заборонити Visual Studio додавати дочірні елементи керування

У мене тут трохи дивного питання. Я створив спеціальний елемент керування:

public class Textbox : System.Web.WebControls.Placeholder
{

    if( [certain criteria are met])
        this.Controls.Add(new System.Web.WebControls.Textbox());

}

При роботі в режимі дизайнера Visual Studio, будь-коли я додаю одну зі своїх текстових полів на сторінку:


Візуальна студія має звичку змінювати мою розмітку на наступне:


    

Це змінює кінцеву розмітку виводу, так що з'являються два текстові поля. Чи є спосіб запобігти цьому?

EDIT: Відповідно до запиту, тут розмітка сторінки

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="TestApp.Test" %>
<%@ Register Assembly="MyControls.WebControls" Namespace="MyControls.WebControls" TagPrefix="myControls" %>


<table>
<tr>
    <td>
        Test Label: 
        
    </td>
</tr>
</table>

0
Я не думаю, що VS збирає сторінку і визначає, що текстове поле буде додано, так що він додає його, але умови можуть статися так, що texbox не буде додано.
додано Автор mrK, джерело
На жаль, користувач не керує. Просто сторінка. Я розміщу розмітку для цього, хоча.
додано Автор mrK, джерело
Мабуть, щось не так з вашим користувачем.
додано Автор Icarus, джерело
Розміщуйте розмітку для вашого користувача
додано Автор Icarus, джерело
схоже, ви розширюєте PlaceHolder, але ваш контроль називається TextBox. Чому так?
додано Автор Icarus, джерело

2 Відповіді

Я думаю, що це відбувається тому, що ваш клас успадковується від елемента керування PlaceHolder , який реалізує клас TemplateControl . Я не знаю, чи є причина для цього, але схоже, що це було б краще, якщо б ви успадкували від керування TextBox .

EDIT

Оскільки ви використовуєте логіку для візуалізації одного з декількох елементів керування, я б успадкував від класу WebControl . Це дозволить вам зробити в основному все, що ви хочете. Хоча я повинен визнати, що ви намагаєтеся зробити, ймовірно, вимагатиме значного обсягу роботи.

1
додано
@Icarus Причина, що вона успадковує від заповнювача, полягає в тому, що в ній можуть бути розміщені інші типи елементів керування. Наша ідея текстового поля полягає в тому, що вона відповідає запису в БД. Ці текстові поля можуть бути, по суті, текстовим, комбінаційним або вікном пропозицій. Існує добре продумана причина для цього, але я не хочу створювати занадто довгий пост. Я можу пояснити, якщо це доречно.
додано Автор mrK, джерело
Так, але чи можна додати елементи керування, які замінюють початковий елемент керування? Якщо я успадковую від текстового поля, то мені б, в основному, потрібна можливість сказати це = new RadComboBox ();//[Керування Telerik]
додано Автор mrK, джерело
Я вважаю, що це може бути відповідь. Я відчуваю себе начебто нерозумно, не думаючи про це. Якщо це не спрацює, чи є спосіб запечатати власність контролерів? Я знаю, що це не хороша практика, але зміна цього може порушити 100 інших речей.
додано Автор mrK, джерело
hehe Я тільки відправив по пошті що як коментар після я подивився близько до його коду;)
додано Автор Icarus, джерело
Ось ми знову ...;)
додано Автор James Johnson, джерело
Навіть якщо ви успадкуєте від елемента керування TextBox, ви все одно зможете додати інші елементи керування в метод візуалізації. Успадкування від керування TextBox просто служить базовою лінією. Наприклад, я зробив це, щоб включити валідатори до свого спеціального текстового поля.
додано Автор James Johnson, джерело
У цьому випадку вам слід просто наслідувати клас WebControl . PlaceHolder , безумовно, не є наслідком, від якого можна наслідувати.
додано Автор James Johnson, джерело
Запечатати як? Зробити це так, щоб його не було доступно через редактор? Можливо, це можна зробити, використовуючи атрибут EditorBrowsable .
додано Автор James Johnson, джерело

Якщо я правильно зрозумів проблему, у вас є проблеми під час розробки, а не під час виконання.

Якщо це так, то слід додати код контрольного додатка тестом, який гарантує, що він виконується тільки тоді, коли ви не перебуваєте в режимі проектування. Наприклад:

    if ((!this.InDesignMode) && ( [certain criteria are met]))
    this.Controls.Add(new System.Web.WebControls.Textbox());
0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug