我用DataList实现了一个考核细则的编辑页面,想添加一个‘添加’按钮,实现客户端动态的添加行,可一次添加多行,添加完点击‘保存’,所有的添加的和以前的都可保存。
我自己用了几个方法都没实现,主要是Js不熟,得到控件ID,添加时设置控件ID,很麻烦。求助大侠们!!!
添加删除我都实现了,我目前的设计思想是,
添加:保存页面信息,重新得到数据源,添加一条新的记录(没有赋值的),重新绑定DataList;
删除:删除一条记录,重新绑定。
不过这样不太符合用户体验,因为点添加的时候,就得保存。
我想用Js实现添加,不保存,等到点击保存时才去保存。
删除的时候也是客户端删除,然后判断是否为新添加的记录,不是的话,再进行实际的删除。
下面是我的代码片段。
aspx:
<asp:DataList ID="MinusItemList" runat="server" Width="100%" BorderWidth="1" DataKeyField="ID" OnItemCommand="MinusItemList_ItemCommand" OnItemDataBound="MinusItemList_ItemDataBound">
<HeaderTemplate>
<tr>
<td style="width: 40px; height: 22px;">
序号 </td>
<td style="width: 297px; height: 22px;">
内容 </td>
<td style="width: 40px; height: 22px;">
扣分 </td>
<td style="width: 80px; height: 22px;">
考核说明 </td>
<td style="width: 50px; height: 22px;" align="center">
删除 </td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:HiddenField ID="MinusID" Value=' <%#DataBinder.Eval(Container,"DataItem.ID") %>' runat="server" />
<asp:TextBox ID="MinusSortNo" runat="server" Width="100%" Text=' <%#DataBinder.Eval(Container,"DataItem.SortNo") %>'> </asp:TextBox> </td>
<td align="left">
<asp:TextBox ID="MinusDetailContent" runat="server" Width="100%" Text=' <%#DataBinder.Eval(Container,"DataItem.DetailContent") %>'> </asp:TextBox> </td>
<td>
<asp:TextBox ID="MinusMark" runat="server" Width="100%" Text=' <%#DataBinder.Eval(Container,"DataItem.Mark") %>'> </asp:TextBox>
</td>
<td >
<asp:TextBox ID="MinusAssessDesc" runat="server" Width="100%" Test=' <%# DataBinder.Eval(Container,"DataItem.AssessDesc") %>'> </asp:TextBox> </td>
<td align="center"> <asp:LinkButton ID ="DelMinusAssessBtn" runat="server" CommandName="Delete">删除 </asp:LinkButton> </td>
</tr>
</ItemTemplate>
</asp:DataList>
<table width="100%">
<tr>
<td align="center">
<asp:ImageButton ID="MinusDetailBtn" runat="server" SkinID="tianjia" OnClick="MinusDetailBtn_Click">
</asp:ImageButton>
</td>
</tr>
</table>
CS:
/// <summary>
/// 扣分项中添加按钮事件处理
/// </summary>
/// <param name="sender"> </param>
/// <param name="e"> </param>
protected void MinusDetailBtn_Click(object sender, EventArgs e)
{
string msg = CheckMinusData();
if (msg != "OK")
{
ShowMessage(msg);
}
else
{
//先保存减分项
SaveMinusDetail();
TempAssessItemID = (string)Request["AssessItemID"];
ArrayList MinusDetail = DJ2_AssessDetailFacade.GetAssessDetail(TempAssessItemID, "0");
DJ2_AssessDetail NewRow = new DJ2_AssessDetail();
NewRow.SortNo = MinusDetail.Count + 1;
MinusDetail.Add(NewRow);
this.MinusItemList.DataSource = MinusDetail;
this.MinusItemList.DataBind();
}
}
//删除事件
protected void MinusItemList_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
string ID = (string)MinusItemList.DataKeys[e.Item.ItemIndex];
DJ2_AssessDetail DelRow = new DJ2_AssessDetail();
DelRow.ID=ID;
DJ2_AssessDetailFacade.DeleteObject(DelRow);
BindMinusDetail();
}
}
我自己用了几个方法都没实现,主要是Js不熟,得到控件ID,添加时设置控件ID,很麻烦。求助大侠们!!!
添加删除我都实现了,我目前的设计思想是,
添加:保存页面信息,重新得到数据源,添加一条新的记录(没有赋值的),重新绑定DataList;
删除:删除一条记录,重新绑定。
不过这样不太符合用户体验,因为点添加的时候,就得保存。
我想用Js实现添加,不保存,等到点击保存时才去保存。
删除的时候也是客户端删除,然后判断是否为新添加的记录,不是的话,再进行实际的删除。
下面是我的代码片段。
aspx:
<asp:DataList ID="MinusItemList" runat="server" Width="100%" BorderWidth="1" DataKeyField="ID" OnItemCommand="MinusItemList_ItemCommand" OnItemDataBound="MinusItemList_ItemDataBound">
<HeaderTemplate>
<tr>
<td style="width: 40px; height: 22px;">
序号 </td>
<td style="width: 297px; height: 22px;">
内容 </td>
<td style="width: 40px; height: 22px;">
扣分 </td>
<td style="width: 80px; height: 22px;">
考核说明 </td>
<td style="width: 50px; height: 22px;" align="center">
删除 </td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:HiddenField ID="MinusID" Value=' <%#DataBinder.Eval(Container,"DataItem.ID") %>' runat="server" />
<asp:TextBox ID="MinusSortNo" runat="server" Width="100%" Text=' <%#DataBinder.Eval(Container,"DataItem.SortNo") %>'> </asp:TextBox> </td>
<td align="left">
<asp:TextBox ID="MinusDetailContent" runat="server" Width="100%" Text=' <%#DataBinder.Eval(Container,"DataItem.DetailContent") %>'> </asp:TextBox> </td>
<td>
<asp:TextBox ID="MinusMark" runat="server" Width="100%" Text=' <%#DataBinder.Eval(Container,"DataItem.Mark") %>'> </asp:TextBox>
</td>
<td >
<asp:TextBox ID="MinusAssessDesc" runat="server" Width="100%" Test=' <%# DataBinder.Eval(Container,"DataItem.AssessDesc") %>'> </asp:TextBox> </td>
<td align="center"> <asp:LinkButton ID ="DelMinusAssessBtn" runat="server" CommandName="Delete">删除 </asp:LinkButton> </td>
</tr>
</ItemTemplate>
</asp:DataList>
<table width="100%">
<tr>
<td align="center">
<asp:ImageButton ID="MinusDetailBtn" runat="server" SkinID="tianjia" OnClick="MinusDetailBtn_Click">
</asp:ImageButton>
</td>
</tr>
</table>
CS:
/// <summary>
/// 扣分项中添加按钮事件处理
/// </summary>
/// <param name="sender"> </param>
/// <param name="e"> </param>
protected void MinusDetailBtn_Click(object sender, EventArgs e)
{
string msg = CheckMinusData();
if (msg != "OK")
{
ShowMessage(msg);
}
else
{
//先保存减分项
SaveMinusDetail();
TempAssessItemID = (string)Request["AssessItemID"];
ArrayList MinusDetail = DJ2_AssessDetailFacade.GetAssessDetail(TempAssessItemID, "0");
DJ2_AssessDetail NewRow = new DJ2_AssessDetail();
NewRow.SortNo = MinusDetail.Count + 1;
MinusDetail.Add(NewRow);
this.MinusItemList.DataSource = MinusDetail;
this.MinusItemList.DataBind();
}
}
//删除事件
protected void MinusItemList_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
string ID = (string)MinusItemList.DataKeys[e.Item.ItemIndex];
DJ2_AssessDetail DelRow = new DJ2_AssessDetail();
DelRow.ID=ID;
DJ2_AssessDetailFacade.DeleteObject(DelRow);
BindMinusDetail();
}
}