#asp.net #user-controls
#asp.net #пользовательские элементы управления
Вопрос:
У меня есть пользовательский элемент управления в моем веб-приложении. он предназначен для ввода адреса связи.
для ввода адреса существует 2 режима: extended and basic
.
В extended
мы вводим адрес1, адрес2, адрес3, город, штат, почтовый индекс и страну в разных элементах управления, а в basic mode
мы вводим все вышеуказанные данные в простое многострочное текстовое поле.
Для переключения между этими режимами используется кнопка переключения.
Это работает, если я переключаюсь с расширенного на базовый, потому что просто добавить все непустые текстовые поля с помощью a vbcrlf
и отобразить его в многострочном текстовом поле.
Моя проблема заключается в том, когда мы переключаемся с базового на расширенный. Я хочу знать, есть ли пустые строки или нет. Я был бы еще лучше, если бы вы могли предоставить мне существующий пользовательский элемент управления с той же функциональностью.
Спасибо.
===================================
Extended Mode - I enter every thing individually in different textboxes.
-------------
|Address 1 |
-------------
| |
-------------
|Address 3 |
-------------
| |
-------------
|State |
-------------
| |
-------------
|Country |
-------------
Toggle
Present scenario - The array
array(0) = "Address1"
array(1) = ""
array(2) = "Address2"
array(3) = ""
array(4) = "State"
array(5) = ""
array(6) = "Country"
I click on the Toggle and switch to Basic mode. Here I am displaying all the address lines which are not empty in a long text box with multiline = True.
-------------
|Address1 |
|Address3 |
|State |
|Country |
| |
-------------
Toggle
Now, i will edit the address and delete the Address3 which is on the line 2.
-------------
|Address1 |
|State |
|Country |
| |
-------------
Toggle
Now when i click on the toggle, i need to see the textboxes in the extended mode are having the correct values.
-------------
|Address 1 |
-------------
| |
-------------
| |
-------------
| |
-------------
|State |
-------------
| |
-------------
|Country |
-------------
Toggle
I think, it is clear. i need to go by line by line only as i can enter the same text in two lines.
for example
City - New York.
State - New York.
in the above case, i need to identify which new york (City / State) is deleted / modified.
Thanks.
-=====================
Ответ №1:
Хорошо, согласно вашему отредактированному вопросу, я создал UserControl, который должен работать для вас. Конечно, вам нужно изменить макет в соответствии с вашими требованиями:
ascx:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="MultiFieldTextbox.ascx.vb" Inherits="WebApplication2.MultiFieldTextbox" %>
<asp:Panel ID="PnlBasic" Visible="false" runat="server">
<asp:TextBox ID="TxtFields" runat="server" TextMode="MultiLine" Width="200" Height="200"></asp:TextBox>
</asp:Panel>
<asp:Panel ID="PnlExtended" Visible="true" runat="server">
<asp:TextBox ID="TxtAddress1" runat="server"></asp:TextBox>
<asp:TextBox ID="TxtAddress2" runat="server"></asp:TextBox>
<asp:TextBox ID="TxtAddress3" runat="server"></asp:TextBox>
<asp:TextBox ID="TxtCity" runat="server"></asp:TextBox>
<asp:TextBox ID="TxtState" runat="server"></asp:TextBox>
<asp:TextBox ID="TxtZip" runat="server"></asp:TextBox>
<asp:TextBox ID="TxtCountry" runat="server"></asp:TextBox>
</asp:Panel>
<asp:Button ID="BtnSwitchMode" runat="server" Text="switch mode" />
ascx-codebehind:
Public Class MultiFieldTextbox
Inherits System.Web.UI.UserControl
Public Enum ViewMode As Int32
Basic
Extended
End Enum
Public Property Mode As ViewMode
Get
If Me.PnlBasic.Visible Then
Return MultiFieldTextbox.ViewMode.Basic
Else
Return MultiFieldTextbox.ViewMode.Extended
End If
End Get
Set(ByVal value As ViewMode)
Me.PnlBasic.Visible = value = ViewMode.Basic
Me.PnlExtended.Visible = value = ViewMode.Extended
InitNewMode(value)
End Set
End Property
Public Property Addr1 As String
Get
Return Me.TxtAddress1.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtAddress1.Text = value.Trim
End Set
End Property
Public Property Addr2 As String
Get
Return Me.TxtAddress2.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtAddress2.Text = value.Trim
End Set
End Property
Public Property Addr3 As String
Get
Return Me.TxtAddress3.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtAddress3.Text = value.Trim
End Set
End Property
Public Property City As String
Get
Return Me.TxtCity.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtCity.Text = value.Trim
End Set
End Property
Public Property State As String
Get
Return Me.TxtState.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtState.Text = value.Trim
End Set
End Property
Public Property Zip As String
Get
Return Me.TxtZip.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtZip.Text = value.Trim
End Set
End Property
Public Property Country As String
Get
Return Me.TxtCountry.Text.Trim
End Get
Set(ByVal value As String)
Me.TxtCountry.Text = value.Trim
End Set
End Property
Private Property FieldInfos As Dictionary(Of String, FieldInfo)
Get
If ViewState("FieldInfos") Is Nothing Then
ViewState("FieldInfos") = New Dictionary(Of String, FieldInfo)
End If
Return DirectCast(ViewState("FieldInfos"), Dictionary(Of String, FieldInfo))
End Get
Set(ByVal value As Dictionary(Of String, FieldInfo))
ViewState("FieldInfos") = value
End Set
End Property
Private Sub InitNewMode(ByVal newMode As ViewMode)
Select Case newMode
Case ViewMode.Basic
Dim builder As New Text.StringBuilder
Dim lineNumber As Int32 = 0
Dim key = "Addr1"
Dim field = Me.Addr1
FieldInfos = New Dictionary(Of String, FieldInfo)
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
key = "Addr2"
field = Me.Addr2
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
key = "Addr3"
field = Me.Addr3
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
key = "City"
field = Me.City
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
key = "State"
field = Me.State
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
key = "Zip"
field = Me.Zip
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
key = "Country"
field = Me.Country
lineNumber = 1
If field.Length <> 0 Then builder.Append(String.Format("{0}{1}", field, ControlChars.NewLine))
FieldInfos.Add(key, New FieldInfo(lineNumber, key, field))
If builder.Length <> 0 Then builder.Length -= ControlChars.NewLine.Length
Me.TxtFields.Text = builder.ToString
Case ViewMode.Extended
Dim lineNumber As Int32 = 0
Dim allLines = Me.TxtFields.Text.Split(New String() {ControlChars.NewLine}, StringSplitOptions.None)
For Each line In allLines
lineNumber = 1
' set value via old line number '
Dim q = From field In Me.FieldInfos
Where field.Value.Line = lineNumber
Select field
If q.Any Then
Me.FieldInfos(q.First.Key).Value = line
End If
Next
Dim diff = FieldInfos.Count - allLines.Length
If diff <> 0 Then
Dim line As Int32
For line = (1 allLines.Length) To (diff allLines.Length)
' set value=String.Empty for each missing line '
Dim q = From field In Me.FieldInfos
Where field.Value.Line = line
Select field
If q.Any Then
Me.FieldInfos(q.First.Key).Value = String.Empty
End If
Next
End If
Me.Addr1 = Me.FieldInfos("Addr1").Value
Me.Addr2 = Me.FieldInfos("Addr2").Value
Me.Addr3 = Me.FieldInfos("Addr3").Value
Me.City = Me.FieldInfos("City").Value
Me.State = Me.FieldInfos("State").Value
Me.Zip = Me.FieldInfos("Zip").Value
Me.Country = Me.FieldInfos("Country").Value
End Select
End Sub
Protected Sub BtnSwitchMode_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnSwitchMode.Click
Dim newMode As ViewMode = If(Me.Mode = ViewMode.Basic, ViewMode.Extended, ViewMode.Basic)
Me.Mode = newMode
End Sub
End Class
<Serializable()>
Public Class FieldInfo
Public Property ID As String
Public Property Value As String
Public Property Line As Int32
Public Sub New(ByVal line As Int32, ByVal ID As String, ByVal Value As String)
Me.Line = line
Me.ID = ID
Me.Value = Value
End Sub
End Class
Комментарии:
1. это работает, если введены все адресные строки (add1, add2, add3, город, штат, почтовый индекс, страна). допустим, если я дам add1, add3, state, country, то как точно узнать, чтобы поместить их в соответствующие текстовые поля в расширенном режиме.
2. Спасибо Tim.it работает, если заданы все add1, add2, add3, город, штат, почтовый индекс, страна. как, если я укажу только add1, add3, штат, страну. как мы можем узнать, что add2 пуст, а add3 помещен в правильное текстовое поле и т. Д. Пожалуйста, помогите.
3. @Kompella: Я не понимаю проблемы. У вас есть 7 полей. Если вы переключитесь в базовый режим, у вас будет строковый массив длиной 7, который вы передаете вышеуказанному свойству. Текстовое поле. Текст будет правильно заполнен новыми строками после каждого поля. Если пользователь удалит одну строку, останется пустая строка, которая все еще находится в строковом массиве (как пустая строка), а длина массива по-прежнему равна 7. Так что не должно быть проблем с переключением в расширенный режим.
4. @Kompella: Отредактировал мой ответ. Почему бы вам просто не передавать всегда массив длиной 7 в свойство, даже если не все поля заполнены в расширенном режиме? Таким образом, вы можете легко переключаться между обоими режимами.
5. Тим, когда мы переключаемся с расширенного режима на базовый, я делаю то, что ты сказал. передача значений из текстовых полей в массив. Но я отображаю только строки адреса, которые не являются пустыми в текстовом поле (базовый режим). теперь, если я что-то изменю и переключусь на расширенный. необходимо найти правильную адресную строку и поместить текст. я дам вам схематический подход в сообщении после этого. Спасибо.