飘啊飘 发表于 2014-1-16 20:38:37

求助:gridview里面列设置为check后,为何表相应列的值不改变

本帖最后由 飘啊飘 于 2014-1-17 12:56 编辑

我用的版本是13.2


经过长时间测试
求助内容变更为 工具栏中的按钮无法正确获取到gridview中被更改的datatable列的值,具体内容见3楼

UserTable表里面包含”Selected“这一列
然后绑定数据源
gridControl.DataSource = UserTable;
表格相应列的Field字段也设置成了”Selected“
不管是将列设置手动成checkedit,将UserTable里面的Selected设置成int或bool,而且也按照selected字段的属性设置相应的ValueChecked和ValueUnchecked的值
还是将Selected设置成bool让gridview自动读取为check列
但是为什么勾选复选框都不能改变UserTable中Selected对应row的值
全部勾选后
foreach(datarow i in usertable.rows)
{
console.writeline(i["selected"].tostring());
}
得到的值还是原始的值,是不是还有什么地方没设置的?




nyfor 发表于 2014-1-17 11:30:09

也许是因为你直接绑定的DataTable原因. 请改用 BindingSource 来绑定.
BindingSource bds = new BindingSource();
bds.DataSource = UserTable;
gridControl.DataSource = bds;
你试试看是不是就能够改变基础数据源了 ?

飘啊飘 发表于 2014-1-17 12:47:37

nyfor 发表于 2014-1-17 11:30
也许是因为你直接绑定的DataTable原因. 请改用 BindingSource 来绑定.
BindingSource bds = new BindingSou ...
虽然无效,但是谢谢楼上。
经过几个小时的折腾发现,在windows的ToolStrip和Dev的barManager里面的按钮好像都不能正确获取被改变的值,以下是简单测试代码,用console输出各行各列的值,然后用select方法查找selected列为1的行

<p>      private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
      {
            int n = 1;
            foreach (DataRow i in UserTable.Rows)
            {
                Console.WriteLine("\r\n第 {0} 行", n);
                foreach (DataColumn a in UserTable.Columns)
                {
                  Console.Write(a.ColumnName + ":");
                  Console.Write(i.ToString() + "\t");
                }
                n++;
            }
            DataRow[] dr = UserTable.Select("Selected = 1");
            MessageBox.Show(dr.Length.ToString());
      }</p><p>
</p><p>      //用一个额外的按钮可以正确获取到selected的值
      private void simpleButton1_Click(object sender, EventArgs e)
      {
            int n = 1;
            foreach (DataRow i in UserTable.Rows)
            {
                Console.WriteLine("\r\n第 {0} 行", n);
                foreach (DataColumn a in UserTable.Columns)
                {
                  Console.Write(a.ColumnName + ":");
                  Console.Write(i.ToString() + "\t");
                }
                n++;
            }
            DataRow[] dr = UserTable.Select("Selected = 1");
            MessageBox.Show(dr.Length.ToString());
      }</p>具体症状是:
1、随便勾选一行后,点击barButtonItem1按钮,console输出中显示所有行的selected列的值都是0,获取到dr的长度也是0,
   再点击simpleButton1,console输出中显示被勾选的那一行的selected列的值是1,获取到dr的长度是1,
   这时候再点击barButtonItem1就可以返回正常的列数据和dr的长度。


2、每勾选一行后,点击一下barButtonItem1按钮
      输出显示:勾选一行,console输出中显示所有行的selected列的值都是0,获取到dr的长度也是0,
                     再勾选一行,console输出中显示上一次勾选的行的selected列的是1,当前勾选的行是0,获取到的dr长度是1,这时已经勾选了2行了,
                     继续勾选一行,console输出中显示第一次和第二次勾选的行的selected列是1,当前勾选的行是0,获取到的dr的长度是2,这时已经勾选了3行。
   但是每勾选一行点击一下simpleButton1按钮,勾选一行显示1,勾选两行显示2,勾选三行显示3,这就一切正常。


另外,把测试的代码写成一个方法,在ToolStrip或barManager中调用这个方法,也获取不到正确的值,而且在barButtonItem1中直接调用simpleButton1_Click(sender,e);也获取不到正确的值。
在ToolStrip和barManager中的按钮都有这个问题,单独的按钮却没有这个问题,这个是BUG吗?还是其他什么问题?



nyfor 发表于 2014-1-17 13:20:55

工具栏按钮的确是这样的,也不是BUG,工具栏按钮不获取焦点,所以不能让Grid触发改变数据源的事件. 普通按钮如果你设置为不允许获取焦点,应该也是类似的现象.

解决此问题的方法就是想办法用代码改变焦点, 类似于你勾选了一行后再在别的行点击一下.

针对此问题, 我一般是在 Form 上放置一个 TextBox,宽度1,高度0, 注意该TextBox不能设Visible = False,必须是可见的, 但因为高度或是宽度设置为0,实际上却看不到, 另外再设置其 TabStop 为 False.

在你的工具栏按钮事件中 将焦点 移到这个 TextBox, 然后再移回去.

飘啊飘 发表于 2014-1-17 13:52:31

nyfor 发表于 2014-1-17 13:20
工具栏按钮的确是这样的,也不是BUG,工具栏按钮不获取焦点,所以不能让Grid触发改变数据源的事件. 普通按钮如 ...

在工具栏按钮的代码最前面加了一个改变焦点的代码,确实正常了,太感谢了
页: [1]
查看完整版本: 求助:gridview里面列设置为check后,为何表相应列的值不改变