您的位置:首页 > 编程语言 > C#

C# datagridviewcomboxcolumn数据的绑定与值的显示

2012-03-10 12:06 609 查看
     对于我这样一个C#菜鸟,啥都不会,啥都得在网上找资料,一点一滴的学,很困难,所以把自己学习过程中遇到的一些儿问题记录于此,便于自己复查,也便于其它同仁学习。

     在一个datagridview中有一列,我想做成下拉的,这样可以让用户从在选定某个值,经过自己慢慢尝试终于搞定,记录如下:

想实现的功能如下:



打开这个权限管理的界面后,我可以更改用户的角色(角色是已经在另外一个界面中设置好的),当我选中左侧的某个角户或角色时,相应的用户名和角色名将显示在右侧上方的对应textbox处;

数据为表:

       用户表:User (UserID, UserName) (注:还有其它列,与此处无关,便不提) 

       角色表:Role(RoleID, RoleName)

       用户与角色实体关系:一个用户只属于一个角色,一个角色有多个用户。

      

     在datagridview中打开列编辑器如下:



设置ColumnType的属性如上图,设置DisplayStyle为DropDownButton(这样只有下拉,而用户不可输入),比较重要的是将ReadOnly属性设为false,要不绑定数据后,用户将无法选择绑定的数据!!如果没有设置默认值,则用户将看不到数据也不能更改!在这个问题上让我纠结了好久!

      相关代码如下:

               //绑定角色信息到datagridviewcomboxcolumn列中,该列的列名为roleName

                RoleManage roleMan = new RoleManage();

                DataSet roleDataSet = roleMan.GetRoleInfo("");//获取角色信息

                roleName.DataSource = roleDataSet.Tables[0]; //roleName为datagridview中角色列的列名。设置数据源

                roleName.DisplayMember = "RoleName";//设置格式化的值的数据源,即在用户看到的下拉文本来自数据库表的列,这里数据库表列名为RoleName

                roleName.ValueMember = "RoleID";//设置下拉文本对应的真实值的数据源。

                绑定用户信息到datagridview中,在datagridview相应的列已经设置了DataPropertyName属性,属性值与数据库表中的列名相同,这样当绑定数据源后,datagridview能将数据库中相应的列显示出来。

                UserManage userMan = new UserManage();

                DataSet userDataSet = userMan.GetUserInfo(""); //获取用户信息

                uRPRelationDataGridView.DataSource = userDataSet.Tables[0];//设置数据源

 

                显示用户默认的角色

int roleIDTmp;

                UserRolePowerRelationManage uRPRMan = new UserRolePowerRelationManage();

                for (int i = 0; i < uRPRelationDataGridView.Rows.Count; i++ )

                {

                    roleIDTmp = uRPRMan.GetRoleByUserID(Convert.ToInt32(uRPRelationDataGridView.Rows[i].Cells["UserID"].Value.ToString()));//确定用户的角色,如果还没有给该用户分配角色,则其角色查到的角色ID为-1

                    uRPRelationDataGridView.Rows[i].Cells["roleID"].Value = roleIDTmp.ToString();//将用户的角色ID显示在datagridview的角色ID列中,该列的列名为roleID

                    if (roleIDTmp != -1)//如果还没有为该用户分配角色,则让角色名为空。

                    {

                           uRPRelationDataGridView.Rows[i].Cells["roleName"].Value= roleIDTmp; //将用户所属的角色名选中(该单元格的值是角色ID,显示的是角色名),这里即是设置datagridviewcomboxcolumn列默认的显示文本。(选中了该单元格的真实值,将自动显示其对应的文本,即在这里有一个映射过程)

                           //MessageBox.Show(uRPRelationDataGridView.Rows[i].Cells["roleName"].FormattedValue.ToString());

                          //这里uRPRelationDataGridView.Rows[i].Cells["roleName"].FormattedValue.ToString()即是当前datagridviewcomboxcolumn列(在这里为roleName列)显示的文本!!对于datagridview其它不是下拉的列,其单元格的值(value)与格式化的值(显示给用户看的值)(FormattedValue)相同

                    }

                }//for (int i = 0; i < uRPRelationDataGridView.Rows.Count; i++ )     

         

         接下来是将选中的行的角色名显示在右侧的textbox当中,这需要用到几个事件,相关代码如下:

        //在 DataGridView 控件中的当前单元格更改或者该控件接收到输入焦点时发生。

        //如果该控件没有输入焦点,并且单击的单元格以前不是当前单元格,则此事件可能会在一次单击中出现两次。

        private void uRPRelationDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)

        {

            if (uRPRelationDataGridView.CurrentRow != null)

            {

                object formattedValue = uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue;

                object value = uRPRelationDataGridView.CurrentRow.Cells["roleName"].Value;

                if (formattedValue != null && value != null)

                {

                    //int roleIDTmp = Convert.ToInt32(uRPRelationDataGridView.CurrentRow.Cells["roleName"].Value.ToString().Trim());//获取当前选中的角色ID

                    roleNameTextBox.Text = uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue.ToString();                    

                }

                else

                {

                    roleNameTextBox.Text = "";

                }

            }

        }//private void uRPRelationDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)

 

       //该事件在用户指定的值提交时发生,用户指定的值通常是在焦点离开单元格时提交。

        private void uRPRelationDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)

        {

            if (uRPRelationDataGridView.CurrentRow != null)

            {

                if (uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue != null)

                {

                    roleNameTextBox.Text = uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue.ToString();

                    //uRPRelationDataGridView.CurrentRow.Cells["roleID"].Value = uRPRelationDataGridView.CurrentRow.Cells["roleName"].Value;

                }

            }

        }//private void uRPRelationDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)

 

      //当单元格的内容已更改,但更改尚未保存时,该单元格将标记为已修改。

        //此事件通常会在以下情况下发生:当单元格已编辑,但是更改尚未提交到数据缓存中时,或者当编辑操作被取消时。

        private void uRPRelationDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)

        {

            if (uRPRelationDataGridView.IsCurrentCellDirty)//IsCurrentCellDirty值指示当前单元格是否有未提交的更改,如果有则为true

            {

                uRPRelationDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);//将当前单元格中的更改提交到数据缓存,但不结束编辑模式。这个将触发CellValueChanged事件

            }

        }

 

 参考文档:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewcell.formattedvalue.aspx

                   http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridview_events(v=vs.80).aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息