先大致说下需求:
1.GridView中展示数据的同时可以编辑数据
2.一条数据的一些属性只能是一些特定的值,并且属性A是属性B的基础;具体的问题是为某个成员指定操作权限(这里用角色代替),需要指定操作范围和具体的组织;操作范围(属性A,简单点,当然有很多,这里仅说明问题)有两个 Team (隶属后者) Department;具体组织(哪些Team及Department)
3.在只读状态变为编辑状态时,需要保留原数据
4.在编辑状态下,选择范围后,后面的DropdownList加载这个范围的具体组织
代码及注释如下
<asp:GridView Width="800px" ID="GV_Detail" runat="server" AutoGenerateColumns="False" CellPadding="4"
ForeColor="#333333" OnRowCancelingEdit="GV_Detail_RowCancelingEdit"
OnRowCommand="GV_Detail_RowCommand" OnRowEditing="GV_Detail_RowEditing" OnRowUpdating="GV_Detail_RowUpdating"
OnRowDeleting="GV_Detail_RowDeleting">
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
<Columns>
<asp:TemplateField HeaderStyle-VerticalAlign="Middle" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<HeaderTemplate>
Action
</HeaderTemplate>
<ItemTemplate>
<asp:LinkButton Text="<img src='../images/edit.gif' border=0>" CommandName="edit"
CommandArgument='<%#Eval("MemberId") %>' runat="Server" ID="Linkbutton1" />
<asp:LinkButton Text="<img src='../images/delete.gif' border=0>" CommandName="delete"
OnClientClick="javascript:return confirm('Are you sure you want to delete this?')"
CommandArgument='<%#Eval("MemberId") %>' runat="Server" ID="Linkbutton4" />
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton Text="<img src='../images/update.gif' border=0>" CommandName="update"
CommandArgument='<%#Eval("MemberId") %>' runat="Server" ID="Linkbutton2" />
<asp:LinkButton Text="<img src='../images/cancel.gif' border=0>" CommandName="cancel"
CommandArgument='<%#Eval("MemberId") %>' runat="Server" ID="Linkbutton3" />
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Addible" HeaderStyle-VerticalAlign="Middle" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<ItemTemplate>
<asp:CheckBox ID="chk_Add" runat="server" Enabled="false" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Addible"))%>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chk_EAdd" runat="server" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Addible"))%>' />
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Modify" HeaderStyle-VerticalAlign="Middle" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<ItemTemplate>
<asp:CheckBox ID="chk_Modify" runat="server" Enabled="false" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Modify"))%>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chk_EModify" runat="server" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Modify"))%>' />
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Search" HeaderStyle-VerticalAlign="Middle" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<ItemTemplate>
<asp:CheckBox ID="chk_Search" runat="server" Enabled="false" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Search"))%>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chk_ESearch" runat="server" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Search"))%>' />
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="Statistics" HeaderStyle-VerticalAlign="Middle" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<ItemTemplate>
<asp:CheckBox ID="chk_Statistics" runat="server" Enabled="false" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Statistics"))%>' />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chk_EStatistics" runat="server" Checked='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Statistics"))%>' />
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="OrganizationLevel" HeaderStyle-VerticalAlign="Middle"
HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<ItemTemplate>
<asp:Label ID="lab_Level" runat="server" Text='<%#Eval("OrganizationLevel") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList runat="server" ID="drp_Level" SelectedValue='<%# GetCurLevel((DataBinder.Eval(Container.DataItem, "OrganizationLevel")).ToString())%>'
OnSelectedIndexChanged="drp_Level_SelectIndexChanged" AutoPostBack="true" DataTextField="LevelName"
DataValueField="LevelID" DataSource='<%#GetAllLevel() %>'>
</asp:DropDownList>
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
<asp:TemplateField HeaderText="OrganizationName" HeaderStyle-VerticalAlign="Middle"
HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
<ItemTemplate>
<asp:Label ID="lab_ID" runat="server" Text='<%#GetOrganization(DataBinder.Eval(Container.DataItem, "OrganizationLevel").ToString(),DataBinder.Eval(Container.DataItem, "OrganizationID").ToString()) %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList runat="server" ID="drp_Organization">
</asp:DropDownList>
<asp:HiddenField ID="hdf_Organization" runat="server" Value='<%#Eval("OrganizationID") %>'/>
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
</asp:TemplateField>
</Columns>
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#2461BF" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
由于本人JS水平实在有限,故全部使用类似ASP绑定数据
#region PublicMethod
protected string GetOrganization(string level, string organizationID)
{
EnumOrganizational enumOrganization = (EnumOrganizational)Enum.Parse(typeof(EnumOrganizational), level);
return new BLLRole_Attribute().GetOrganizationName(enumOrganization, organizationID);
}
protected DataTable GetAllLevel()
{
DataTable result = new DataTable();
DataColumn c1 = new DataColumn("LevelID");
DataColumn c2 = new DataColumn("LevelName");
result.Columns.Add(c1);
result.Columns.Add(c2);
DataRow r1 = result.NewRow();
r1["LevelID"] = 3;
r1["LevelName"] = EnumOrganizational.Team;
result.Rows.Add(r1);
DataRow r2 = result.NewRow();
r2["LevelID"] = 2;
r2["LevelName"] = EnumOrganizational.SubDepartment;
result.Rows.Add(r2);
DataRow r3 = result.NewRow();
r3["LevelID"] = 1;
r3["LevelName"] = EnumOrganizational.Department;
result.Rows.Add(r3);
DataRow r4 = result.NewRow();
r4["LevelID"] = 0;
r4["LevelName"] = EnumOrganizational.Company;
result.Rows.Add(r4);
//#region 根据层级绑定具体组织结构
//string a = (GV_Detail.DataSource as List<BORoleAttribute>)[GV_Detail.EditIndex].OrganizationID;
//#endregion
return result;
}
protected string GetCurLevel(string level)
{
EnumOrganizational enumOrganization = (EnumOrganizational)Enum.Parse(typeof(EnumOrganizational), level);
return Convert.ToInt32(enumOrganization).ToString();
}
protected List<ItemList<string, string>> GetAllOrganization(string level)
{
EnumOrganizational enumOrganization = (EnumOrganizational)Enum.Parse(typeof(EnumOrganizational), level);
return new BLLRole_Attribute().GetAllOrganizationByLevel(enumOrganization);
}
#endregion
protected void GV_Detail_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GV_Detail.EditIndex = -1;
bdDetail(string.Empty);
}
protected void GV_Detail_RowCommand(object sender, GridViewCommandEventArgs e)
{
string MemberID = e.CommandArgument.ToString();
switch (e.CommandName)
{
case "edit":
break;
case "cancel":
break;
case "update":
//更新操作
GV_Detail.EditIndex = -1;
bdDetail(string.Empty);
break;
case "delete":
//删除操作
break;
}
}
protected void GV_Detail_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
}
protected void GV_Detail_RowEditing(object sender, GridViewEditEventArgs e)
{
GV_Detail.EditIndex = e.NewEditIndex;
bdDetail(string.Empty);
#region 此处用于根据选择的组织结构层次来加载对应具体的组织结构(并且选定原数据),写到此处的目的 不得已而为之
//因为属于级联相关的,既后面的DropDownList是根据前面的DropDownList的当前选择项来加载数据,
//此处代码的主要目的是:用户点击了编辑按钮后,这些可编辑项是这条数据的初始值
GridViewRow row = GV_Detail.Rows[GV_Detail.EditIndex];
DropDownList drp_Level = row.FindControl("drp_Level") as DropDownList;
drp_Level_SelectIndexChanged(drp_Level, new EventArgs());
DropDownList Organization = row.FindControl("drp_Organization") as DropDownList;
Organization.SelectedValue = (row.FindControl("hdf_Organization") as HiddenField).Value;
#endregion
}
protected void GV_Detail_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
}
protected void drp_Level_SelectIndexChanged(object sender, EventArgs e)
{
GridViewRow row = GV_Detail.Rows[GV_Detail.EditIndex];
DropDownList item = row.FindControl("drp_Organization") as DropDownList;//获得后面的DropDownList
item.DataTextField = "Name";
item.DataValueField = "ID";
item.DataSource = GetAllOrganization((sender as DropDownList).SelectedValue);//根据当前的DropdownList的选择项 加载后者的数据源
item.DataBind();
}
private void bdDetail(string memberID)
{
if (string.IsNullOrEmpty(memberID))
{
if (ViewState["MemberID"] != null)
{
memberID = ViewState["MemberID"].ToString();
}
}
BLLRole_Attribute bllRole_Attribute = new BLLRole_Attribute();
GV_Detail.DataSource = bllRole_Attribute.GetRoleAttributesByMemberID(memberID);
GV_Detail.DataBind();
}