Как все остальное: это зависит.
нет никакого жесткого правила относительно количества столбцов по сравнению с количеством таблицы.
, Если у Ваших клиентов должно быть несколько адресов, то отдельная таблица для этого имеет смысл. Если у Вас есть действительно серьезное основание нормализовать столбец City в его собственную таблицу, то это может пойти также, но я не видел, что прежде, потому что это (обычно) - поле свободной формы.
таблица А тяжелый, нормализованный дизайн эффективен с точки зрения пространства и выглядит "хорошим для учебника", но может стать чрезвычайно сложным. Это выглядит хорошим, пока Вы не должны делать 12 соединений для получения имени и адреса клиента. Эти проекты не автоматически фантастические с точки зрения производительности, которая имеет значение больше всего: запросы.
Избегают сложности, если это возможно. Например, если у клиента может быть только два адреса (не произвольно многие), то могло бы иметь смысл просто сохранять их всех в единственной таблице (CustomerID, Имя, ShipToAddress, BillingAddress, ShipToCity, BillingCity, и т.д.).
Вот сообщение Jeff по теме.
По какой-то причине этого не происходит, если для текстового поля установлено значение ReadOnly.
Я думаю, что есть обходной путь отображая редактируемое текстовое поле для пользователя, улавливая нажатия клавиш и обновляя текстовое поле только для чтения, которое скрыто от пользователя.
Все еще немного беспорядочно, но я не могу вернуться к выпуску мая, потому что есть еще одна ошибка в этот выпуск с ComboBox, которого мне нужно избегать!
ОБНОВЛЕНИЕ:
В качестве фона у меня есть пользовательский элемент управления (ascx) внутри модального всплывающего окна, потому что мне нужно его повторно использовать. Ascx должен обрабатывать пользователя ' s input (содержащая страница не знает, что происходит внутри элемента управления), поэтому, когда пользователь нажимает кнопку, я выполняю обратный вызов и обрабатываю данные. Если клиентской функции обратного вызова возвращается успешный результат, я имитирую щелчок по кнопке «ОК», по мнению содержащейся на ней, которая фактически невидима для пользователя.
Я изменил свой код, чтобы добавить скрытую, readonly textbox и копируйте текст из исходного текстового поля в новое каждый раз, когда текст изменяется.
<asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
, тогда при передаче значений обратно в обратном вызове вместо получения значения txtName я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
происходит внутри элемента управления), поэтому, когда пользователь нажимает кнопку, я выполняю обратный вызов и обрабатываю данные. Если клиентской функции обратного вызова возвращается успешный результат, я имитирую щелчок по кнопке «ОК», по мнению содержащейся на ней, которая фактически невидима для пользователя.Я изменил свой код, чтобы добавить скрытую, readonly textbox и копируйте текст из исходного текстового поля в новое каждый раз, когда текст изменяется.
<asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
, тогда при передаче значений обратно в обратном вызове вместо получения значения txtName я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
происходит внутри элемента управления), поэтому, когда пользователь нажимает кнопку, я выполняю обратный вызов и обрабатываю данные. Если клиентской функции обратного вызова возвращается успешный результат, я имитирую щелчок по кнопке «ОК», по мнению содержащейся на ней, которая фактически невидима для пользователя.Я изменил свой код, чтобы добавить скрытую, readonly textbox и копируйте текст из исходного текстового поля в новое каждый раз, когда текст изменяется.
<asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
, тогда при передаче значений обратно в обратном вызове вместо получения значения txtName я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
Если клиентской функции обратного вызова возвращается успешный результат, я имитирую щелчок по кнопке «ОК», по мнению содержащейся на ней, которая фактически невидима для пользователя.Я изменил свой код, чтобы добавить скрытую, readonly textbox и копируйте текст из исходного текстового поля в новое каждый раз, когда текст изменяется.
<asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
, тогда при передаче значений обратно в обратном вызове вместо получения значения txtName я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
Если клиентской функции обратного вызова возвращается успешный результат, я имитирую щелчок по кнопке «ОК», по мнению содержащейся на ней, которая фактически невидима для пользователя.Я изменил свой код, чтобы добавить скрытую, readonly textbox и копируйте текст из исходного текстового поля в новое каждый раз, когда текст изменяется.
<asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
, тогда при передаче значений обратно в обратном вызове вместо получения значения txtName я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
я изменил свой код, чтобы добавить скрытое текстовое поле, доступное только для чтения, и копировать текст из исходного текстового поля в новое каждый раз, когда текст изменяется. <asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
тогда при передаче значений обратно в обратном вызове вместо получения значения txtName, я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
я изменил свой код, чтобы добавить скрытое текстовое поле, доступное только для чтения, и копировать текст из исходного текстового поля в новое каждый раз, когда текст изменяется. <asp:TextBox runat="server" ID="txtName"></asp:TextBox>
становится
<asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
<asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>
тогда при передаче значений обратно в обратном вызове вместо получения значения txtName, я использую txtNameRO.
Я не думаю, что это поможет, если вы выполняете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как я. Надеюсь, это все равно кому-то поможет!
У меня была та же проблема, когда предыдущие значения возвращались через запятую. Похоже, моя кнопка ОК была внутри панели обновлений, и у меня она тоже была в разделе триггеров. Удаление кнопки из раздела триггеров на панели обновления решило проблему.
С уважением, Тобиас
Здесь то же самое. Понятия не имею, почему это происходит. Каждая обратная передача, инициированная кнопками на панели, добавляет запятые и предыдущие значения ко всем текстовым полям.
Подключение к TextBox.Text установщику показало, что поврежденные данные поступают из сбора постданных. Это означает, что непосредственно перед обратной передачей ModalPopupExtender повреждает данные.
PS Я использую не UpdatePanel, а обычную панель, поэтому нет триггеров, связанных с кнопками.
Обновлено: Решение найдено.
Проблема кажется исчезнуть при откате к майскому выпуску AjaxToolKit ( http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326 ).
Я успешно реализовал полный взлом, основанный на ответе Джен. Я использую asp: HiddenField для хранения значения, которое я хочу отправить обратно, и заполняю его полем ввода в чистом HTML
<asp:HiddenField ID="txt" runat="server"/>
<input type="text" onchange='document.getElementById("<%= txt.ClientID %>").value = this.value;' />
. Это легче, чем решение Jen, поскольку вы все еще отправляете обратно только один серверный элемент управления.
Кстати, это очень серьезная ошибка в Ajax Toolkit. Вы можете проголосовать и прокомментировать это здесь:
Представьте, что вы находитесь в Чикаго. Голосуйте досрочно, голосуйте чаще.
Для меня решением было убрать модальный пакет с главной панели обновлений. Как только я это сделал, запятые исчезли. Если вам действительно нужна панель обновления внутри модального всплывающего окна, создайте свою собственную внутри этой панели.
Мне не нужно было возвращаться к предыдущей версии инструментария.
I уже день пытаюсь решить эту проблему, и один очень услужливый человек в моем офисе придумал потрясающее решение!
Мы переместили ModalPopUpExtender и последующую всплывающую панель, управляемую расширителем, за пределы самой внешней UpdatePanel на странице, создали поддельную кнопку и передали идентификатор поддельной кнопки свойству TargetControlID ModalPopUpExtender.
<asp:Button runat="server" ID="dummyButton" CausesValidation="false" Style="display: none" />
<cc1:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="dummyButton" CancelControlID="CancelPopUp" PopupControlID="PanelID" BackgroundCssClass="modalBackground" />
Внутри моих форм / страницы, где раньше находились расширитель PopUp и панели, я создал событие OnClick для кнопки, которую мы использовали для запуска ModalPopUpExtender.
<asp:ImageButton ID="ButtonID" runat="server" Text="Add" ImageUrl="~/Images/Add-32-1-small.png" OnClick="LoadPopUp" />
На моей кнопке, которая запускает ModalPopUpExtender, я создал событие OnClick под названием «LoadPopUp» - в LoadPopUp в коде позади я просто поместил ModalPopUpExtender1.Show ();
protected void LoadPopUp(object sender, EventArgs e)
{
ModalPopupExtender1.Show();
}
Я также нашел форум, указывающий на то, что это может быть стандартным поведением html, когда на форме есть несколько элементов управления с одинаковым именем. Учитывая это (и предполагая, что это ошибка в ajax элементах управления), я решил обойти эту проблему, добавив в Page_Load следующее утверждение для каждого из моих textbox'ов.
string[] vals = txtValue.Text.Split(Convert.ToChar(",")); txtValue.Text = vals[vals.Length - 1];//Получается, что мое последнее значение всегда было в последнем элементе
Поскольку загрузка формы происходит до события кнопки, я сортирую свои поля до того, как они попадают в событие, которое работает с их значениями.