对于我这样一个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