最近项目中用到第三方控件DevExpress,在这里写下自己用到的一些体会:
本人语言表达能力不好,还望见谅。
功能:主从表,主表选中行变化时,从表相应变化,最后将修改的值存入数据库。
详细说明:
1) 表结构:
1.1) 用户表: 用户基本信息.
1.2) 角色表:角色信息.
1.3) 用户角色关系表: 用户角色关系.
2) 两个AspxGridView(主,从),当主AspxGridView选中某一行后,触发脚本事件FocusedRowChanged,gridRole.PerformCallback(s.GetFocusedRowIndex(),
然后在脚本事件中触发服务器端事件gridRole_CustomCallback,根据主AspxGridView选中行的ID,重新绑定从AspxGridView数据的checkbox状态。
3) 修改时当从AspxGridView选中行变化时,触发脚本事件gridRole_SelectionChanged,用隐藏的ASPxListBox保存选中的值,
最后在后台循环取出ASPxListBox值,插入数据库
.ASPX 代码:
<script type="text/javascript">
function gridRole_SelectionChanged(s, e) {
s.GetSelectedFieldValues("RoleId", GetSelectedFieldValuesCallback);
}
function GetSelectedFieldValuesCallback(values) {
selList.BeginUpdate();
try {
selList.ClearItems();
for (var i = 0; i < values.length; i++) {
selList.AddItem(values[i]);
}
} finally {
selList.EndUpdate();
}
}
</script>
<div>
<table>
<tr>
<td valign="top" >
<dx:ASPxGridView ID="grid" ClientInstanceName="grid" runat="server" Width="300px"
AutoGenerateColumns="false" KeyFieldName="UserId" ClientIDMode="AutoID" OnCustomColumnDisplayText="grid_CustomColumnDisplayText">
<Styles Row-Cursor="pointer">
<Row Cursor="pointer">
</Row>
<AlternatingRow Enabled="True">
</AlternatingRow>
</Styles>
<ClientSideEvents FocusedRowChanged="function(s, e) {
gridRole.PerformCallback(s.GetFocusedRowIndex());
}" />
<Columns>
<dx:GridViewDataTextColumn Caption="序号" VisibleIndex="1" Width="5%">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn Caption="登录名称" FieldName="LoginName" ShowInCustomizationForm="True"
VisibleIndex="2">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn Caption="姓名" FieldName="UserName" VisibleIndex="3">
</dx:GridViewDataTextColumn>
</Columns>
<SettingsBehavior AllowFocusedRow="True" />
<SettingsPager AlwaysShowPager="True">
</SettingsPager>
<Styles>
<AlternatingRow Enabled="True">
</AlternatingRow>
<Row Cursor="pointer">
</Row>
</Styles>
</dx:ASPxGridView>
</td>
<td style="width: 50px;">
</td>
<td valign="top" >
<dx:ASPxGridView ID="gridRole" ClientInstanceName="gridRole" runat="server" Width="200px"
AutoGenerateColumns="False" KeyFieldName="RoleId" ClientIDMode="AutoID" OnCustomCallback="gridRole_CustomCallback">
<SettingsPager AlwaysShowPager="True">
</SettingsPager>
<Styles>
<Row Cursor="pointer">
</Row>
<AlternatingRow Enabled="True">
</AlternatingRow>
</Styles>
<Columns>
<dx:GridViewCommandColumn ShowSelectCheckbox="True" VisibleIndex="0" Width="5%">
<ClearFilterButton Visible="True">
</ClearFilterButton>
<HeaderStyle HorizontalAlign="Center" />
<CellStyle HorizontalAlign="Center">
</CellStyle>
<HeaderTemplate>
<input type="checkbox" onclick="gridRole.SelectAllRowsOnPage(this.checked);" title="全选 />
</HeaderTemplate>
</dx:GridViewCommandColumn>
<dx:GridViewDataTextColumn Caption="序号" VisibleIndex="1" Width="5%">
<DataItemTemplate>
<%# Container.ItemIndex+1%>
</DataItemTemplate>
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn Caption="角色名称" FieldName="RoleName" ShowInCustomizationForm="True"
VisibleIndex="2">
</dx:GridViewDataTextColumn>
</Columns>
<SettingsBehavior AllowFocusedRow="True" AllowMultiSelection="true" />
<Styles Row-Cursor="pointer">
<Row Cursor="pointer">
</Row>
<AlternatingRow Enabled="True">
</AlternatingRow>
</Styles>
<ClientSideEvents SelectionChanged="gridRole_SelectionChanged" />
</dx:ASPxGridView>
</td>
</tr>
</table>
</div>
<div style="display: none;">
<dx:ASPxListBox ID="lsbRoleId" ClientInstanceName="selList" runat="server">
</dx:ASPxListBox>
</div>
.CS 代码:
protected void Page_Load(object sender, EventArgs e)
{
BindData();
BindDataRole();
}
private void BindData()
{
DataSet ds = userManager.GetUser();
grid.DataSource = ds.Tables[0].DefaultView;
grid.DataBind();
}
private void BindDataRole()
{
DataSet ds = roleManager.GetList();
gridRole.DataSource = ds.Tables[0].DefaultView;
gridRole.DataBind();
}
protected void grid_CustomColumnDisplayText(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewColumnDisplayTextEventArgs e)
{
if (e.Column.VisibleIndex == 0)
{
e.DisplayText = (e.VisibleRowIndex + 1).ToString();
}
}
private void SaveUserRole()
{
string sUserId = Convert.ToString(grid.GetRowValues(grid.FocusedRowIndex, "UserId"));
int iResult = 0;
string RoldIdList = string.Empty;
string url = string.Empty;
for (int i = 0; i < lsbRoleId.Items.Count; i++)
{
RoldIdList += lsbRoleId.Items[i].ToString() + ',';
}
//## 插入到数据库语句
lsbRoleId.Items.Clear();
}
protected void btnSave_Click(object sender, EventArgs e)
{
SaveUserRole();
}
protected void gridRole_CustomCallback(object sender, ASPxGridViewCustomCallbackEventArgs e)
{
string userid = Convert.ToString(grid.GetRowValues(grid.FocusedRowIndex, "UserId"));
ASPxGridView gd = sender as ASPxGridView;
gd.Selection.UnselectAll();
DataSet ds = userManager.GetRoleByUserId(userid);
for (int i = 0; i < gd.VisibleRowCount; i++)
{
string RoleIdRow = string.Empty;
RoleIdRow = Convert.ToString((gd.GetRowValues(i, "RoleId")));
if (RoleIdRow != string.Empty)
{
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
{
string roleDs = Convert.ToString(ds.Tables[0].Rows[j]["RoleId"]);
if (RoleIdRow == roleDs)
{
gd.Selection.SelectRow(i);
}
}
}
}
}
}
如果有多列ASPxCheckBox,在后台FindRowCellTemplateControl找到ASPxCheckBox,但不能取出它的状态,可以通过脚本循环取出页面的checkbox状态,然后保存到ASPxHiddenField, 最后存入数据库, 前提是不分页,这种方法不是很好。
DevExpress论坛上解决方法是,每点击ASPxCheckBox触发脚本,把修改的值保持到ASPxHiddenField,然后触发服务器事件,保存数据,然后绑定只有这样显示才是正确的。
相关资料:
http://demos.devexpress.com/ASPxGridViewDemos/
http://www.devexpress.com/Support/Center/p/Q275320.aspx
如有做的不对的地方,不明白,或者更好的方法,请大家提出来,相互交流, 谢谢!