zoukankan      html  css  js  c++  java
  • xtragrid 上移下移

    xtragrid 实现焦点行的上移下移主要还是对gridviw绑定的数据表的操作,如果只是简单的显示而不做保存操作那么比较简单,直接把绑定的数据表中的前后两行更换下数据,具体如下:

    代码
     private void UpOrDown(DevExpress.XtraGrid.Views.Grid.GridView GridView, bool ISUpOrDown,string TabName)
            {
                DataRow row 
    = GridView.GetFocusedDataRow();
                
    if (ISUpOrDown)
                    GridView.MovePrev();
                
    else
                    GridView.MoveNext();
                DataRow Pretrow 
    = GridView.GetFocusedDataRow();
                DataRow IRow 
    = lblPrintDS1.Tables[TabName].NewRow();
                
    for (int k = 0; k < row.ItemArray.Length; k++)
                    IRow[k] 
    = Pretrow[k];
                
    for (int i = 0; i < row.ItemArray.Length; i++)
                    Pretrow[i] 
    = row[i];
                
    for (int j = 0; j < row.ItemArray.Length; j++)
                    row[j] 
    = IRow[j];
            }

    ------------------------------------------------------------------------------------------------------------------------------------------- 

    但是如果所作的上移下移要保存到数据库则要麻烦些,比如gridview绑定的表:datatable 包含“行号”一列作为主键,具体如下:

    代码
      private void ItemRowUpOrDown(bool isUP)
            {
                DataRow fRow 
    = GridView.GetDataRow(GridView.FocusedRowHandle);
                DataRow row;
                
    if (isUP)
                {
    //上移
                    row = GridView.GetDataRow(GridView.FocusedRowHandle - 1);
                }
                
    else
                {
    //下移
                    row = GridView.GetDataRow(GridView.FocusedRowHandle + 1);
                }
                
    if (fRow == null || row == nullreturn;
                
    if (!fRow["itemid"].ToString().Trim().Equals(row["itemid"].ToString().Trim()))
                {
                    
    if (isUP)
                        MessageBoxShow.ShowProMessage(
    "选择的商品已经移到改单据的第一行", StrTitle);
                    
    else
                        MessageBoxShow.ShowProMessage(
    "选择的商品已经移到改单据的最后一行", StrTitle);
                    
    return;
                }
                
    int fNO = Convert.ToInt32(fRow["SORTNO"]);
                
    int NO = Convert.ToInt32(row["SORTNO"]);
                fRow[
    "SORTNO"= NO;
                row[
    "SORTNO"= fNO;
                gridControl1.Refresh();
                gridControl1.RefreshDataSource();
                GridView.RefreshData();
                DataView dv 
    = (DataView)GridView.DataSource;
                
    if (dv != null)
                {
                    dv.Sort 
    = "SORTNO asc";
                }
                GridView.ClearSelection();
                
    if (isUP)
                {
                    GridView.FocusedRowHandle 
    = NO - 1;
                    GridView.SelectRow(NO 
    - 1);
                }
                
    else
                {
                    GridView.FocusedRowHandle 
    = fNO;
                    GridView.SelectRow(fNO);
                }
            }

     ----------------------------------------------------------------------------------------------------------------------------------

    一行一行的上移下移还是比较简单的比较只是换下行号,但如果gridview根据某一两列分组 要实现一组一组的上移下移比较麻烦!

    原因是gridview 按某列分组后,(目前不知道什么原因),gridview会根据分组列自动升序排序 (强制的)。解决的办法比较麻烦死板 是在分组的第一列自动添加

    一个序列。  如下图 选择测试单据后上移效果

     

     

    假设一张表 datatable dt 有七列列 :

    “单据名称 slipname”、“单据名称旧(和单据名称完全一样oldslipName ”、“单据日期 slipdate”、“商品编码 itemcode”、“商品id itemid”、“单据id slipid”、“行号 sortno”。

    现在 根据  单据名称、单据日期分组(一条单据下有一条或多条商品)代码如下:

    第一步: 

     private void InertOrderValue()
            {
                
    int no = 0;
                
    string strCD = string.Empty;
                
    bool isSame = false;
                
    for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow dr 
    = dt.Rows[i];
                    
    if (dr["slipid"].ToString().Trim() == strCD)
                    {
                        isSame 
    = true;
                    }
                    
    else
                        isSame 
    = false;
                    strCD 
    = dr["slipid"].ToString().Trim();
                    
    if (isSame)
                    {
    //自定义 【000000000】
                        string str = no.ToString().PadLeft(9'0');
                        str 
    = string.Format("[{0}]", str);
                        dr[
    "slipname"= str + dr["oldslipName"];
                    }
                    
    else
                    {
                        no 
    = no + 1;
                        
    string str = no.ToString().PadLeft(9'0');
                        str 
    = string.Format("[{0}]", str);
                        dr[
    "slipname"= str + dr["oldslipName"];
                    }
                }
            }

     第二步:上移下移

    代码
     private void SlipRowUpOrDown(bool isUP)
            {
                DataRow fRow 
    = GridView.GetDataRow(GridView.FocusedRowHandle);
                DataRow row;
                
    int fRowHandle = GridView.FocusedRowHandle;
                
    if (isUP)
                {
    //上移
                    row = GridView.GetDataRow(GridView.FocusedRowHandle + 1);
                    fRowHandle 
    = GridView.FocusedRowHandle + 1;
                }
                
    else
                {
    //下移
                    row = GridView.GetDataRow(GridView.FocusedRowHandle - 1);
                   fRowHandle
    = GridView.FocusedRowHandle -1;
                }
                
    if (fRow != null && row == null)
                {
                    
    return;
                }
                
    object selGroupRow = GridView.GetGroupRowValue(GridView.FocusedRowHandle);
                
    if (selGroupRow != null)
                {
                    
    if (string.IsNullOrEmpty(selGroupRow.ToString().Trim()))
                        
    return;
                    
    if (!selGroupRow.ToString().Trim().Contains("["))
                        
    return;
                }
                
    int start = fRow["slipname"].ToString().Trim().IndexOf("]");
                
    string uperName = fRow["slipname"].ToString().Trim().Substring(0, start+1);//上一行的单据名称
                string downName = row["slipname"].ToString().Trim().Substring(0, start+1);//下一行的单据名称
                if (!fRow["slipid"].ToString().Trim().Equals(row["slipid"].ToString().Trim()))
                {
                    DataRow[] thisDr 
    = dt.Select(string.Format("slipid='{0}'", fRow["slipid"].ToString().Trim()));
                    DataRow[] uperDr 
    = dt.Select(string.Format("slipid='{0}'", row["slipid"].ToString().Trim()));
                    
    for (int i = 0; i < thisDr.Length; i++)
                    {
                        thisDr[i][
    "slipname"= downName + fRow["oldslipName "];
                    }
                    
    for (int i = 0; i < uperDr.Length; i++)
                    {
                        uperDr[i][
    "slipname"= uperName + row["oldslipName "];
                    }
                }
              
                GridView.ClearSelection();
                GridView.FocusedRowHandle 
    = fRowHandle;
                GridView.SelectRow(fRowHandle);
            }

     第三步:重构数据集

    代码
       private void OrderDataSet(string orderColumn)
            {
                DataTable dtt 
    = dt.Clone();
                dtt.Merge(dt);
                DataView dvv 
    = new DataView(dtt);
                dvv.Sort 
    = orderColumn;
               dt.Clear();
              dt.Merge(dvv.ToTable());
                SortRowNo(dt, 
    "MSTE937_SORTNO");//排序
            }

    第四步:隐藏列名 

    代码
    private void GridVPrm_CustomColumnDisplayText(object sender,DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
            {
             
    if (e.Column.Equals(slipname))
                {
    //单据名称
                    StringBuilder sb = new StringBuilder();
                    sb.Append(dr[
    "oldslipName"].ToString().Trim());
                    e.DisplayText 
    = sb.ToString();
                }
            }

     

     

  • 相关阅读:
    WTL之CAppModule
    WTL之窗口子类化
    专业的日志系统该包含什么?
    ATL之什么是套间
    Java线程新特征之同步
    Java之用句柄操作对象
    Android之Application Fundamentals
    Android之Dev Guide
    一些思考
    WTL之窗口超类化(父类化)
  • 原文地址:https://www.cnblogs.com/6303c/p/1728771.html
Copyright © 2011-2022 走看看