GridView возвращает 2 новые строки сведений о функции AddRow - PullRequest
0 голосов
/ 07 мая 2018

У меня странная и неприятная проблема с моей сеткой, использующей Devexpress.

У меня есть следующая сетка:

enter image description here

У меня есть главная строка (выделенная), и я хочу, чтобы пользователь позволил ей создавать динамически основанные подробные строки и заполнять их. Это все связано с БД sql в спину.

Моя проблема, как вы можете видеть на картинке, заключается в том, что когда я нажимаю кнопку «Создать деталь», вместо 1 создаются 2 новые строки.

Я понятия не имею, почему это так (поскольку моя основная функция addrow не имеет такого поведения).

Что я делаю не так в своем коде?

public partial class Get_Recurring_Items : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        int companyID;
        DataSet ds;
        SqlDataAdapter daRecurrentItems;
        SqlDataAdapter daRecurrentItemsDetails;
        public static SqlConnection conn;

        public Get_Recurring_Items(int _companyID)
        {
            companyID = _companyID;
            InitializeComponent();
            DisplayData();

            btn_CreateDetailRow.ItemClick += Btn_CreateDetailRow_ItemClick;
            gridView.RowUpdated += GridView_RowUpdated;
            btn_Save.ItemClick += Btn_Save_ItemClick;
            gridView.InitNewRow += GridView_InitNewRow;
            detailsView.InitNewRow += DetailsView_InitNewRow;
        }
        private DataSet GetMasterDetail()
        {
            ds = new DataSet();
            ds.Clear();
            ds.Tables.Add(CreateReccuringItemsTable());
            ds.Tables.Add(CreateDetailsTable());
            DataColumn keyColumn = ds.Tables["ReccuringItems"].Columns["ID"];
            DataColumn foreignKeyColumn = ds.Tables["ReccuringItemsDetails"].Columns["Recurring_Item_ID"];
            ds.Relations.Clear();

            ds.Relations.Add("ItemsDetails", keyColumn, foreignKeyColumn, false);

            gridControl.LevelTree.Nodes.Add("ItemsDetails", gridView);

            return ds;
        }

        private DataTable CreateReccuringItemsTable()
        {
            conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
            DataTable tbl = new DataTable("ReccuringItems");

            daRecurrentItems = new SqlDataAdapter("SELECT DISTINCT * FROM Company_Recurring_Items WHERE companyID = @companyID", conn);

            daRecurrentItems.SelectCommand.Parameters.Add(new SqlParameter
            {
                ParameterName = "@companyID",
                Value = companyID,
                SqlDbType = SqlDbType.Int,
            });
            daRecurrentItems.Fill(tbl);
            return tbl;
        }

        private DataTable CreateDetailsTable()
        {
            conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
            DataTable tbl = new DataTable("ReccuringItemsDetails");
            daRecurrentItemsDetails = new SqlDataAdapter("SELECT DISTINCT details.ID, details.Recurring_Item_ID, details.Description , details.Creation_Date FROM Company_Recurring_Items_Details as details", conn);
            daRecurrentItemsDetails.Fill(tbl);
            return tbl;
        }


        private DataSet getReccuringItems()
        {
            ds = new DataSet();
            ds.Clear();
            ds.Tables.Add(CreateReccuringItemsTable());
            return ds;
        }
        void DisplayData()
        {
            gridControl.DataSource = GetMasterDetail().Tables["ReccuringItems"];
            gridView.Columns[0].VisibleIndex = -1;
            gridView.Columns[1].VisibleIndex = -1;
            MessageBox.Show("count =  " + detailsView.Columns.Count.ToString());
            if (gridView.Columns.Count > 0)
            {

                detailsView.Columns.Clear();
                string[] fieldNames = new string[] { "ID", "Recurring_Item_ID", "Description", "Creation_Date" };
                DevExpress.XtraGrid.Columns.GridColumn column;
                detailsView.Columns.Clear();
                for (int i = 0; i < fieldNames.Length; i++)
                {
                    column = detailsView.Columns.AddField(fieldNames[i]);
                    column.VisibleIndex = i;
                }
            }
            try
            {
            }
            catch (Exception e3) { MessageBox.Show(e3.ToString()); }
            //gridView.CellValueChanged += GridView_CellValueChanged;
        }

        private void DetailsView_InitNewRow(object sender, InitNewRowEventArgs e)
        {
            detailsView.SetRowCellValue(e.RowHandle, "Description", "Description");
            detailsView.SetRowCellValue(e.RowHandle, "Creation_Date", DateTime.Now.ToString());
        }

        private void Btn_CreateDetailRow_ItemClick(object sender, ItemClickEventArgs e)
        {
            bool test = true;
            GridView view = gridView.GetDetailView(gridView.FocusedRowHandle, 0) as GridView;
            if (view != null && test == true)
            {
                view.AddNewRow();
                test = false;
            }else
            {
                MessageBox.Show("You must select a master row (item) to create a new detail!");
            }

        }

        private void GridView_InitNewRow(object sender, InitNewRowEventArgs e)
        {
            gridView.SetRowCellValue(e.RowHandle, "companyID", companyID);
        }

        private void GridView_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            GridView currentView = sender as GridView;
            currentView.UpdateCurrentRow();
            //  btn_Save.PerformClick();
            if (ds.Tables["ReccuringItems"] != null)
            {
            //btn_Save.PerformClick();
            }
            else
            {
                MessageBox.Show("error");
            }

            gridView.RefreshData();

        }

        private void Btn_Save_ItemClick(object sender, ItemClickEventArgs e)
        {
            ColumnView View = (ColumnView)gridControl.FocusedView;
            if (!(View.PostEditor() && View.UpdateCurrentRow())) return;
            SqlCommandBuilder scb = new SqlCommandBuilder(daRecurrentItems);
            SqlCommandBuilder scb2 = new SqlCommandBuilder(daRecurrentItemsDetails);
            try
            {
                daRecurrentItems.AcceptChangesDuringUpdate = true;
                daRecurrentItemsDetails.AcceptChangesDuringUpdate = true;
                daRecurrentItems.Update(ds.Tables["ReccuringItems"]);
                daRecurrentItemsDetails.Update(ds.Tables["ReccuringItemsDetails"]);
            }
            catch (SqlException ex)
            {
                Debug.WriteLine(ex.Message);
                MessageBox.Show(ex.Message);
            }
        }

Я попытался использовать следующий обходной путь (но так же, как использовал счетчик), но безуспешно:

  private void Btn_CreateDetailRow_ItemClick(object sender, ItemClickEventArgs e)
    {
        bool test = true;
        GridView view = gridView.GetDetailView(gridView.FocusedRowHandle, 0) as GridView;
        if (view != null && test == true)
        {
            view.AddNewRow();
            test = false;
        }else
        {
            MessageBox.Show("You must select a master row (item) to create a new detail!");
        }

    }

Он по-прежнему создает 2 ряда деталей при нажатии кнопки ...

1 Ответ

0 голосов
/ 09 мая 2018

Чтобы решить эту проблему, вам нужно установить

GridOptionsView.NewItemRowPosition Property

Нет, чтобы скрыть NewRow из сетки подробностей.

https://documentation.devexpress.com/WindowsForms/DevExpress.XtraGrid.Views.Grid.GridOptionsView.NewItemRowPosition.property

GridOptionsView.NewItemRowPosition = NewItemRowPosition.None;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...