我有一个HTML表格,用于在用户输入患者代码后或在患者代码通过Querystring传递的页面加载期间显示数据库中的一组记录。每个数据行都有一个动态创建的删除链接按钮。
我希望删除后刷新表格。但是,每当单击链接按钮时,它将回发并且除非我重新加载数据,否则将清除所有记录。如果我在删除后再次重新加载数据,将会有2次数据获取,表行将加倍。
表格的前两行是在ASPX上定义的,以便于设计样式。如果我在获取数据时清除了表,则第一行也将被清除。我在相同的方式创建了不同页面上的另外8个表,因此我宁愿找到其他解决方案,而不是从后面的代码中定义和设置行。
非常感谢任何帮助。
我使用的代码如下:
ASPX
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblPatientCode" runat="server" Text="Patient Code : "></asp:Label>
<asp:TextBox ID="txtPatientCode" runat="server"></asp:TextBox>
<asp:Button ID="btnFind" runat="server" name="Date" Text="Find" Width="90" CssClass="ButtonNormal" />
<br /><br />
<table id="tblDoctorInformation" class="PatientDetailsTable" runat="server">
<tr><td colspan="2">DOCTOR INFORMATION</td></tr>
<tr>
<td>Doctor In Charge</td>
<td> </td>
</tr>
</table>
</div>
</form>
</body>
代码背后:
Protected PM As New PatientManagement.Common
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
GetPatient()
Else
If txtPatientCode.Text <> "" Then
GetPatient()
End If
End If
End Sub
Private Sub GetPatient()
Dim sPatientCode As String = ""
If IsPostBack Then
sPatientCode = Trim(txtPatientCode.Text)
Else
sPatientCode = Trim(Page.Request.QueryString("PatientCode"))
End If
If sPatientCode <> "" Then
Dim dr As SqlDataReader
dr = PM.ExecuteReader("SELECT LOGID,DOCTORNAME FROM PMV_DOCTORINCHARGE WHERE PATIENTCODE='" & sPatientCode & "'")
If dr.HasRows Then
Do While dr.Read
Dim tRow As New HtmlTableRow
Dim tCellDoctorName As New HtmlTableCell
Dim tCellModifyLink As New HtmlTableCell
Dim lb As New LinkButton
'Doctor Name
tCellDoctorName.InnerHtml = PM.GetString_TableCell(dr("DoctorName"))
tRow.Cells.Add(tCellDoctorName)
'Delete links
lb.Text = "Delete"
lb.Attributes.Add("AutoPostBack", False)
lb.CommandArgument = dr("LogID").ToString()
AddHandler lb.Click, AddressOf DeleteRecord
tCellModifyLink.Controls.Add(lb)
tCellModifyLink.Align = "Center"
tRow.Cells.Add(tCellModifyLink)
tblDoctorInformation.Rows.Add(tRow)
Loop
End If
End If
End Sub
Private Sub btnFind_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFind.Click
GetPatient()
End Sub
Protected Sub DeleteRecord(ByVal sender As Object, ByVal e As System.EventArgs)
Dim lbNew As New LinkButton
Dim sResult As String = ""
Dim bResult As Boolean
lbNew = sender
bResult = PM.DeleteMultiRecord(lbNew.CommandArgument, lbNew.CommandName, Session.Item("UserID"), sResult)
If Not bResult Then
MsgBox(sResult, MsgBoxStyle.OkOnly, "Deletion was not successful")
Else
GetPatient()
End If
End Sub
答案 0 :(得分:1)
在删除记录之前,尝试在文本框中放置PatientID
并删除记录,然后表格将显示与TextBox输入匹配的记录。
问题在于PageLoad()
方法,如果TextBox为空且它是回发,则不会调用GetPatient()
方法。因此,请尝试修改PageLoad()
方法。
最好删除PageLoad()
中的IsPostBack条件。
答案 1 :(得分:0)
我已经四处寻找,似乎动态处理程序最好在PageInit
期间声明。对于我的情况,由于链接按钮控件需要在相应的数据行上携带一些值,似乎我无法避免调用GetPatient
来创建控件。
为了继续解决这个问题,我使用Javascript做了一个解决方法。我在ASPX页面上创建了一个hidLogID
隐藏字段。我将链接按钮更改为<a>
控件并调用传递dr("LogID")
的javascript函数。 javascript函数会将值赋给hidLogID
并提交页面。当PageLoad
值不为空时,DeleteRecord()
会致电hidLogID
。 hidLogID
的值将在DeleteRecord()
上清除。
感谢您的帮助!