datagrid中datagridboolcolumn问题(难)

meixiaofeng 2005-12-26 12:44:49
datagrid中datagridboolcolumn,如何用空格键打钩,bool列只能有一行被选中,这个一行如果是true,界面上的button的Enabled为true,如果一行都没有打钩,button的Enabled为false
...全文
315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
meixiaofeng 2005-12-30
  • 打赏
  • 举报
回复
看来比较麻烦,顶一下
timiil 2005-12-27
  • 打赏
  • 举报
回复
//首先窗体上放几个变量:
private DataTable dtTest = new DataTable();
private DataColumn dcKey = new DataColumn("Key", typeof(string));
private DataColumn dcSelect = new DataColumn("Select", typeof(bool));
private bool flag = false;

///构造函数
public Form1()
{
InitializeComponent();
this.dcSelect.DefaultValue = false;
this.dtTest.Columns.AddRange(new DataColumn[]{this.dcKey, this.dcSelect});
this.dtTest.PrimaryKey = new DataColumn[]{this.dcKey};
this.dtTest.RowChanged += new DataRowChangeEventHandler(dtTest_RowChanged);
for (int i = 0; i < 10; i++) //Gen10条测试记录
{
DataRow dr = this.dtTest.NewRow();
dr[this.dcKey] = "test" + i.ToString();
this.dtTest.Rows.Add(dr);
}

this.dataGrid1.DataSource = this.dtTest.DefaultView; //绑数据源
}

private void dtTest_RowChanged(object sender, DataRowChangeEventArgs e)
{
if (this.flag)
return;
DataRow dr = e.Row;
bool isSelect = (bool)dr[this.dcSelect];
if (e.Action == DataRowAction.Delete)
{
if (isSelect) //刚刚删除了一行被选中的记录
this.button1.Enabled = false;
}
else if (e.Action == DataRowAction.Change)
{
if (isSelect)
{
this.flag = true;
string key = dr[this.dcKey].ToString();
DataRow[] drs = this.dtTest.Select(this.dcKey.ColumnName + " <> '" + key + "'");
foreach (DataRow drBrother in drs)
drBrother[this.dcSelect] = false;
this.flag = false;

this.button1.Enabled = true;
}
else
{
DataRow[] drs = this.dtTest.Select(this.dcSelect.ColumnName + " = True");

this.button1.Enabled = (drs.Length == 1);
}
}
}
MyLf 2005-12-27
  • 打赏
  • 举报
回复
不难吧。
//dtD为绑定到datagrid上的DataTable,该列对应字段为"d",TrueValue = "Y";FalseValue = "N";
private void dtD_ColumnChanging(object sender, DataColumnChangeEventArgs e)
{
if(e.Column.ColumnName == "d")
{
if(e.ProposedValue.ToString() == "Y")
{
DataView dv = new DataView(dtD);
dv.RowFilter = "d = 'Y'";
if(dv.Count >0 && !dv[0].Row.Equals(e.Row))
{
dv[0].Row["d"] = "N";
}
this.button1.Enabled = true;
}
else
{
this.button1.Enabled = false;
}
}
}
yijing8373 2005-12-27
  • 打赏
  • 举报
回复
看了你的问题我觉得你要实现的是不是这样:当选择了以后才可以提交,要不就不让提交?假如是这样的话我觉得你可以变相处理一下会容易一些,就是在提交的时候判断datagrid中是否有被选中的行,假如没有的话,就弹出提示对话框,让他选择,这样的话只要在button中有个判断就行了。当然,只能选择一行这个问题,只要你在选中新的一行后,原来选中的让他变成不选中不就可以了
timiil 2005-12-27
  • 打赏
  • 举报
回复
是得,必须移走焦点,DataGrid才会向内存中的DataSet提交改变,这是DataGrid与生具来的特性了,就算是一些商业的控件,比如DevExpress的XtraGrid,Janus的GridEx,都是这样做。 这样做有个好处,DataGrid为你捕捉一些非法的输入值,比如重复键,或数值字段写字符串等等异常情况,无需这么快就惊动DataSet他老人家。。。

如果你一定要按你说的做,当然也可以,不过麻烦许多了,最彻底的办法是捕捉当前DataGrid的所有鼠标事件和键盘事件,然后判断用户是否Attempt修改你那个宝贝字段,如果是的话,再自行判断用户这次修改是否合法,如果合法,则立刻做我上述代码中dtTest_RowChanged事件的处理咯。。。。。。。
meixiaofeng 2005-12-27
  • 打赏
  • 举报
回复
上面的方法不行,我要空格键按下去,不是当前行的checkbox就为false,而不是焦点要移走才行
meixiaofeng 2005-12-26
  • 打赏
  • 举报
回复
winform,只要datagrid
xamaizi 2005-12-26
  • 打赏
  • 举报
回复
好多grid控件都可以实现这个功能^_^
去codeproject上看看
hoking3210 2005-12-26
  • 打赏
  • 举报
回复
在checkbox的onclick事件里面判断cheched属性,然后作出处理
protected void CheckBox_OnClick(object sender,EventArgs e)
{
foreach(DataGridItem dgi in DataGrid1.Items)
{
HtmlInputCheckBox cb = (HtmlInputCheckBox)di.FindControl("YourCheckBoxID") ;
if(cb !=null && cb.Checked)
{
Button btn=(Button)dgi.FindControl("YourButtonID");
btn.Enabled=true;
}
}
}
ruodeer 2005-12-26
  • 打赏
  • 举报
回复
用过datagrid 但是没想过这个

帮顶!

110,547

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧