ASP.Net 页面回发后文本框内容丢失原因(ReadOnly搞的鬼)【点击看全文】
Posted on 2006-09-21 11:30 RichardZhang 阅读(1216) 评论(1) 收藏 举报
最近做一个控件,很简单的,就是一个DropdownList,一个TextBox,需求如下:
1.DropdownList内容从基础表中读出(每个项目有一个标识:IsOthers),用户可以选择
2.文本框可以输入。
3.业务规则:如果DropdownList选择的项目的IsOthers=1,则文本框变成可以输入的状态;否则文本框变成不可以输入的状态。
但是碰到一个问题:
1、前提说明:DropdownList中最后一个item的标识IsOthers=1
2、问题:当我从其他item切换到最后一个item后,在文本框中输入内容,然后点击保存按钮,就会发现文本框的内容丢失了。这种情况只发生在切换到最后一个item后输入内容,第一次按保存按钮(页面postback)的情况下。
后来发现导致这个bug的原因是Textbox控件的readOnly属性的问题。解决办法就是用disabled属性来代替readOnly实现功能。
最近做一个控件,很简单的,就是一个DropdownList,一个TextBox,需求如下:
1.DropdownList内容从基础表中读出(每个项目有一个标识:IsOthers),用户可以选择
2.文本框可以输入。
3.业务规则:如果DropdownList选择的项目的IsOthers=1,则文本框变成可以输入的状态;否则文本框变成不可以输入的状态。
实现的代码如下
1

<%
@ Control Language="VB" AutoEventWireup="false" CodeFile="SocietyReasonPicker.ascx.vb"2
Inherits="UserControls_SocietyReasonPicker" %>3

4

<script language='javascript' type="text/javascript">
5
function <%=Me.ddlSR.ClientID%>_SeletedChange()6

{7
document.all.<%=Me.ddlSR2.ClientID%>.selectedIndex = document.all.<%=Me.ddlSR.ClientID%>.selectedIndex;8
if (1==document.all.<%=Me.ddlSR2.ClientID%>.value)9

{10
//alert(document.all.<%=Me.ddlSR2.ClientID%>.value);11
document.all.<%=Me.txtOther.ClientID%>.readOnly = false;12
document.all.<%=Me.txtOther.ClientID%>.className = "";13
14

}else
{15
document.all.<%=Me.txtOther.ClientID%>.readOnly = true;16
document.all.<%=Me.txtOther.ClientID%>.className = "rptReadOnly";17
document.all.<%=Me.txtOther.ClientID%>.value="";18
19
}20
21
}22
</script>23

24
<asp:DropDownList ID="ddlSR" runat="server" DataTextField="SocietyReasonName " DataValueField="SocietyReasonID"25
AutoPostBack="false" Width="100px">26
</asp:DropDownList><asp:TextBox ID="txtOther" runat="server" Width="130px" CausesValidation="false" AutoPostBack="false"></asp:TextBox>27

28
<asp:DropDownList ID="ddlSR2" runat="server" DataTextField="SocietyReasonName " DataValueField="IsOthers"29
AutoPostBack="false" Width="100px" style="display:none">30
</asp:DropDownList>31

1
Imports System.Data2
Imports SPER.BusinessFacade3

4

Partial Class UserControls_SocietyReasonPickerClass UserControls_SocietyReasonPicker5
Inherits UserControlBase6

7

Protected Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load8

9
If Not Me.IsPostBack Then10

11
Me.GetSS()12

13
Else14

15
If (Me.ddlSR.Items.Count = 0) Then16

17
Me.GetSS()18

19
End If20

21
End If22

23
If Me.IsOthers Then24

25
Me.txtOther.ReadOnly = FalseTrue26
Me.txtOther.CssClass = ""27
Else28

29
Me.txtOther.ReadOnly = True30
Me.txtOther.CssClass = "rptReadOnly"31
End If32

33
Me.txtOther.ToolTip = Me.txtOther.Text34

35

36
End Sub37

38

Public Property Width()Property Width() As Unit39
Get40

41
Return Me.ddlSR.Width42

43
End Get44
Set(ByVal value As Unit)45

46
Me.ddlSR.Width = value47

48
End Set49
End Property50

51

Public Property Width_TXT()Property Width_TXT() As Unit52
Get53

54
Return Me.txtOther.Width55

56
End Get57
Set(ByVal value As Unit)58

59
Me.txtOther.Width = value60

61
End Set62
End Property63

64
''' <summary>65
''' 供绑定的值.66
''' </summary>67
''' <value></value>68
''' <returns></returns>69
''' <remarks></remarks>70

Public Property Text()Property Text() As String71
Get72

73
If (ViewState(Me.ClientID.ToString & "SocietyReasonID") Is Nothing) Then74

75
Return ""76

77
Else78

79
Return ViewState(Me.ClientID.ToString & "SocietyReasonID")80

81
End If82

83

84
End Get85
Set(ByVal value As String)86

87
ViewState(Me.ClientID.ToString & "SocietyReasonID") = value88

89
If (Not Me.ddlSR.Items.FindByValue(value) Is Nothing) Then90

91
Me.ddlSR.SelectedValue = value92
Me.ddlSR2.SelectedIndex = Me.ddlSR.SelectedIndex93

94
End If95

96
End Set97
End Property98

99
''' <summary>100
''' 其他101
''' </summary>102
''' <value></value>103
''' <returns></returns>104
''' <remarks></remarks>105

Public Property OtherSocietyReason()Property OtherSocietyReason() As String106
Get107

108
Return Me.txtOther.Text109

110
End Get111
Set(ByVal value As String)112

113
Me.txtOther.Text = value114

115
End Set116
End Property117

118

Public Property SelectedSocietyReasonID()Property SelectedSocietyReasonID() As String119
Get120
Return Me.Text121

122
End Get123
Set(ByVal value As String)124

125
Me.Text = value126

127
End Set128
End Property129

130

Public ReadOnly Property IsOthers()Property IsOthers() As Boolean131

132
Get133

134
If SPER.SystemFramework.DbNullConverter.ToInteger(Me.ddlSR2.SelectedValue) = 1 Then135

136
Return True137

138
Else139

140
Return False141

142
End If143

144
End Get145

146
End Property147

148
''' <summary>149
''' 其他项识别编号150
''' </summary>151
''' <value></value>152
''' <returns></returns>153
''' <remarks></remarks>154

Public Property OthersItemID()Property OthersItemID() As String155
Get156
If ViewState(Me.ClientID.ToString & "OthersItemID") Is Nothing Then157

158
ViewState(Me.ClientID.ToString & "OthersItemID") = 0159

160
End If161

162
Return ViewState(Me.ClientID.ToString & "OthersItemID")163

164
End Get165
Set(ByVal value As String)166

167
ViewState(Me.ClientID.ToString & "OthersItemID") = value168

169
End Set170
End Property171

172

173

Private Sub GetSS()Sub GetSS()174

175
Dim ds As DataSet = New SocietyReasonBF().GetSocietyReason176

177
If ds.Tables.Count > 0 AndAlso ds.Tables(0).Rows.Count > 0 Then178

179
Me.ddlSR.SelectedIndex = -1180
Me.ddlSR.Items.Clear()181
Me.ddlSR.Items.Add(New ListItem("", ""))182

183
Me.ddlSR2.SelectedIndex = -1184
Me.ddlSR2.Items.Clear()185
Me.ddlSR2.Items.Add(New ListItem("", "0"))186

187
For Each row As DataRow In ds.Tables(0).Rows188

189
Me.ddlSR.Items.Add(New ListItem(row("SocietyReasonName"), row("SocietyReasonID")))190

191
Me.ddlSR2.Items.Add(New ListItem(row("SocietyReasonName"), row("IsOthers")))192

193
If row("IsOthers") = 1 Then194

195
Me.OthersItemID = row("SocietyReasonID")196
197
End If198

199
Next200

201
End If202

203
Me.SelectedSocietyReasonID = ViewState(Me.ClientID.ToString & "SocietyReasonID")204

205
End Sub206

207

Protected Overrides Sub OnLoad()Sub OnLoad(ByVal e As System.EventArgs)208
Me.ddlSR.Attributes.Add("onchange", Me.ddlSR.ClientID + "_SeletedChange();")209

210
MyBase.OnLoad(e)211
End Sub212

213

214
End Class215

代码很简单,数据取过来之后,客户端实现业务规则的控制(防止页面的刷新)。
然后把控件加载到页面上,效果图如下:
哈哈,看到了吧?用起来还不错。
但是碰到一个问题:
1、前提说明:DropdownList中最后一个item的标识IsOthers=1
2、问题:当我从其他item切换到最后一个item后,在文本框中输入内容,然后点击保存按钮,就会发现文本框的内容丢失了。这种情况只发生在切换到最后一个item后输入内容,第一次按保存按钮(页面postback)的情况下。
后来发现导致这个bug的原因是Textbox控件的readOnly属性的问题。解决办法就是用disabled属性来代替readOnly实现功能。
代码更改如下,见粗体部分:
1
<script language='javascript' type="text/javascript">2
function <%=Me.ddlSR.ClientID%>_SeletedChange()3

{4
document.all.<%=Me.ddlSR2.ClientID%>.selectedIndex = document.all.<%=Me.ddlSR.ClientID%>.selectedIndex;5
if (1==document.all.<%=Me.ddlSR2.ClientID%>.value)6

{7
//alert(document.all.<%=Me.ddlSR2.ClientID%>.value);8
document.all.<%=Me.txtOther.ClientID%>.disabled = false;9
document.all.<%=Me.txtOther.ClientID%>.className = "";10
11

}else
{12
document.all.<%=Me.txtOther.ClientID%>.disabled = true;13
document.all.<%=Me.txtOther.ClientID%>.className = "rptReadOnly";14
document.all.<%=Me.txtOther.ClientID%>.value="";15
16
}17
18
}19
</script>1

Protected Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load2

3
If Not Me.IsPostBack Then4

5
Me.GetSS()6

7
Else8

9
If (Me.ddlSR.Items.Count = 0) Then10

11
Me.GetSS()12

13
End If14

15
End If16

17
If Me.IsOthers Then18

19
Me.txtOther.Enabled = True20
Me.txtOther.CssClass = ""21
Else22

23
Me.txtOther.Enabled = False24
Me.txtOther.CssClass = "rptReadOnly"25
End If26

27
Me.txtOther.ToolTip = Me.txtOther.Text28

29

30
End Sub哈哈!这回就不存在那个bug了。
浙公网安备 33010602011771号