ASPxGridView ShowSelectCheckbox ASPxCheckBox Checked 选中 保存

本文介绍了如何在DevExpress的ASPxGridView中处理选中行和ASPxCheckBox的状态,特别是在主从表场景下。当主表选中行改变时,从表根据主表ID更新选中状态,并通过脚本事件保存选中值到隐藏的ASPxListBox,最后在后台循环保存到数据库。示例代码包括ASP.NET的后台和前端JavaScript实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中用到第三方控件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

 

如有做的不对的地方,不明白,或者更好的方法,请大家提出来,相互交流, 谢谢!

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值