找回密码
 立即注册

QQ登录

只需一步,快速开始

haitun1227

中级会员

16

主题

90

帖子

540

积分

中级会员

积分
540

活字格认证

haitun1227
中级会员   /  发表于:2013-9-24 15:36  /   查看:4972  /  回复:6
我想在listbox与从flexgrid实现拖拽的时候,拖放在flexgrid没有数据的位置。flexgrid有数据的位置不能拖放如何实现?

附件中第一个图时拖放在有数据的位置,这样是不允许的。第二个图是拖放在有数据位置上的结果。
第三张图是拖放在没有数据的位置的效果。
我用
int row = this.grdMain.MouseRow;

int col = this.grdMain.MouseCol;
this.flexgrid.GetData(row ,col)取得拖放位置时一直有数据并且数据是选择的listbox对应的数据。
应该如何判断我在flexgrid拖放的位置是否有数据?
应该如何解决?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

6 个回复

倒序浏览
gw0506
超级版主   /  发表于:2013-9-24 17:48:00
沙发
你是在什么时机去获取MouseRow和MouseCol的?从代码上看应该是这个思路。你看看MouseRow和MouseCol取的对不对。
回复 使用道具 举报
haitun1227
中级会员   /  发表于:2013-9-24 18:19:00
板凳
listBox 的MouseDown事件
private void  lst_MouseDown(object sender, MouseEventArgs e)
        {
          //  DoDragDropメソッドを呼び出す
                if(this.lstHeader.SelectedItem != null)
                {
                    this.lstHeader.DoDragDrop(this.lstHeader.SelectedItem, DragDropEffects.Copy);
                }

                //  ドラッグアンドドロップの位置を取得する
                int row = this.grdMain.MouseRow;
                int col = this.grdMain.MouseCol;

                //  DragDropする場所を判定する
                if(row > 0 && col > 0)
                {
                    //  lstHeaderが<空>を選ばれた場合を判断する
                    if(this.lstHeader.SelectedItem.Equals("<空>"))
                    {
                        this.grdMain.GetCellRange(row, col).Clear(ClearFlags.Style);
                        this.grdMain[row, col] = "";
                    }
                    else
                    {
                        //  2013/9/24 hw Mod >>
                        CellStyle cs = this.grdMain.Styles.Add("Yellow");
                        cs.BackColor = Color.Yellow;
                        this.grdMain.SetCellStyle(row, col, cs);
                        //  2013/9/24 hw <<
                    }
                }
}
flexgrid的DragEnter事件
private void grdEnter_DragEnter(object sender, DragEventArgs e)
{
        //  ドラッグアンドドロップ類型をセットする
            if(e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Copy;
            }
}
flexgrid的DragDrop事件
private void grdDrop_DragDrop(object sender, DragEventArgs e)
  {
           //  値を取得する
            string item = (string)e.Data.GetData(e.Data.GetFormats()[0]);
            int row = this.grdMain.MouseRow;
            int col = this.grdMain.MouseCol;

            //  DragDropする場所は条件を満たすかを判定する
            if(row > 0 &amp;&amp; col > 0)
            {
                //  値をセットする
                if(item.Equals("<空>"))
                {
                    grdMain.SetData(row, col, " ");
                    this.grdMain.GetCellRange(row, col).Clear(ClearFlags.Style);
                }
                else
                {
                    grdMain.SetData(row, col, item);
                }
            }
        }
点击lst_MouseDown事件(设置拖放位置的颜色)和grdDrop_DragDrop事件(设置拖放位置的数据),获取MouseRow和MouseCol的。
回复 使用道具 举报
gw0506
超级版主   /  发表于:2013-9-25 09:24:00
地板
你加个断点看看DragDrop事件有没有进来,取一下row和col看看值对不对。
回复 使用道具 举报
unity
社区贡献组   /  发表于:2013-9-25 09:56:00
5#
响应grid的DragOver事件。
在事件里面进行判断处理,注意这个事件中的鼠标位置是相对屏幕的,需要转换为grid的相对坐标。
然后根据坐标取行列信息进行判断。(HitTest)
回复 使用道具 举报
haitun1227
中级会员   /  发表于:2013-9-25 12:42:00
6#
可以进去dragdrop事件,拿到的值是flexgrid中的值,值是对的。
那我在listBox 的MouseDown事件中拿到flexgrid中的值是选则listbox的值,
我想拿到的时flexgrid本身的值,不是选择托的值,有什么办法?
回复 使用道具 举报
unity
社区贡献组   /  发表于:2013-9-25 13:26:00
7#
一般来说drop后的处理应该全部放到target的drop事件中做。
如果要在source的mousedown中做的话,首先需要判断 DoDragDrop 的返回值。
你的代码里面没有判断这个返回值是不正确的。

在dragover的时候根据鼠标判断是否允许拖放,不允许是设置 e.Effect = DragDropEffects.None;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部