DevD9 Ответов: 1

Изменить значение ячейки в DataGrid с DataGridTemplateColumn, содержащая поле со списком


Я генерирую графический интерфейс редактирования динамически на основе определения XML. Одним из элементов управления является Tab Control с несколькими вкладками. Каждая вкладка содержит 1 DataGrid. DataGrid генерируется на основе столбцов/значений, доступных в определении. Каждый столбец представляет собой DataGridTemplateColumn, содержащий ComboBox или Textbox. Последний столбец-это столбец действий, содержащий кнопку. Я могу генерировать первую строку с данными, основанными на данных, доступных в коллекции. Проблема заключается в том, что когда я пытаюсь добавить новую строку, данные все еще являются старыми данными (как в выбранном значении ComboBox 1-й строки), а новые данные не выбраны. Вот этот код.
private DataGridTemplateColumn AddDataGridComboBoxColumn(XmlNodeList _childnodeList, string header, DataTable table, DataRow row , string data = "")
        {
            DataGridTemplateColumn column = new DataGridTemplateColumn();
            if (!table.Columns.Contains(header))
            {
                var comboTemplate = new FrameworkElementFactory(typeof(ComboBox));
                List<string> items = new List<string>();
                for (int count = 0; count < _childnodeList.Count; count++)
                {
                    items.Add(_childnodeList.Item(count).InnerText.ToString());
                }
                comboTemplate.SetValue(ComboBox.ItemsSourceProperty, items);
                comboTemplate.SetBinding(ComboBox.SelectedItemProperty, new Binding(data));
                comboTemplate.SetValue(ComboBox.SelectedItemProperty, data);

                column.Header = header;
                column.CellTemplate = new DataTemplate() { VisualTree = comboTemplate };
                column.CellEditingTemplate = new DataTemplate() { VisualTree = comboTemplate };

                DataColumn dtcolumn = new DataColumn();
                dtcolumn.Caption = header;
                dtcolumn.ColumnName = header;
                //dtcolumn.DataType = typeof(ComboBox);
                table.Columns.Add(dtcolumn);
                row[header] = items;
            }
            else
                column.SetCurrentValue(ComboBox.SelectedValueProperty, data);

            return column;
        }

private DataGrid CreatedRepeatingGroupDataGrid(XmlNodeList _childnodeList, string data)
        {
            DataTable table = new DataTable();
            
            dgRepeatingGroups = new DataGrid();
            dgRepeatingGroups.AutoGenerateColumns = false;
            dgRepeatingGroups.CanUserAddRows = true;
            dgRepeatingGroups.CanUserDeleteRows = true;
            dgRepeatingGroups.HorizontalAlignment = HorizontalAlignment.Left;

            if (data != "")
            {
                string[] arrayofRowdata = data.Split(System.Environment.NewLine.ToCharArray());
                
                for (int i = 0; i < arrayofRowdata.Length; i++)
                {
                    
                    if (arrayofRowdata[i] != "")
                    {
                        if (i == 0)
                        {
                            DataRow row = table.NewRow();
                            
                        foreach (XmlNode _node in _childnodeList)
                        {
                            string id = _node.Attributes.Item(0).Value;
                            string labelchild = _node.Attributes.Item(1).Value;
                            string type = _node.Attributes.Item(2).Value;
                            string datavalue = string.Empty;

                            string[] arrayofdata = arrayofRowdata[i].Split(';');

                            for (int i1 = 0; i1 < arrayofdata.Length; i1++)
                            {
                                if (arrayofdata[i1].Contains(labelchild.Replace(".", "")))
                                {
                                    datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' ');
                                    break;
                                }
                            }
                            

                                if (type.ToUpper() == "DECIMAL" || type.ToUpper() == "STRING")
                                {
                                    dgRepeatingGroups.Columns.Add(AddDataGridTextColumn(labelchild, table, row, datavalue));
                                    
                                }

                                else if (type.ToUpper() == "COMBO")
                                {
                                    dgRepeatingGroups.Columns.Add(AddDataGridComboBoxColumn(_node.ChildNodes, labelchild, table, row, datavalue));
                                    //dgRepeatingGroups.Columns.Add(AddDGComboBoxColumn(_node.ChildNodes, labelchild, table, row));
                                }
                                else if (type.ToUpper() == "DATE")
                                {
                                    dgRepeatingGroups.Columns.Add(AddDataGridDatePickerColumn(labelchild, "datepicker", table, row, datavalue));
                                }
                                
                            }
                        
                        }
                        else
                        {
                            DataRow row = table.NewRow();
                            table.Rows.InsertAt(row, table.Rows.Count);
                            
                            foreach (XmlNode _node in _childnodeList)
                            {
                                string id = _node.Attributes.Item(0).Value;
                                string labelchild = _node.Attributes.Item(1).Value;
                                string type = _node.Attributes.Item(2).Value;
                                string datavalue = string.Empty;

                                string[] arrayofdata = arrayofRowdata[i].Split(';');

                                for (int i1 = 0; i1 < arrayofdata.Length; i1++)
                                {
                                    if (arrayofdata[i1].Contains(labelchild.Replace(".", "")))
                                    {
                                        datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' ');
                                        break;
                                    }
                                }
                                //datavalue is hold value of selectedvalue for each combobox and text for each textbox.
                                row[labelchild] = datavalue;
                                                    
                        }
                    }
                    
                }
            }
            else
            {
                DataRow row = table.NewRow();
                foreach (XmlNode _node in _childnodeList)
                {
                    string id = _node.Attributes.Item(0).Value;
                    string labelchild = _node.Attributes.Item(1).Value;
                    string type = _node.Attributes.Item(2).Value;
                    string datavalue = string.Empty;

                    string[] arrayofdata = data.Split(';');

                    for (int i1 = 0; i1 < arrayofdata.Length; i1++)
                    {
                        if (arrayofdata[i1].Contains(labelchild.Replace(".", "")))
                        {
                            datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' ');
                            break;
                        }
                    }

                    if (type.ToUpper() == "DECIMAL" || type.ToUpper() == "STRING")
                    {
                        dgRepeatingGroups.Columns.Add(AddDataGridTextColumn(labelchild, table, row, datavalue));

                    }

                    else if (type.ToUpper() == "COMBO")
                    {
                        dgRepeatingGroups.Columns.Add(AddDataGridComboBoxColumn(_node.ChildNodes, labelchild, table, row, datavalue));
                        //dgRepeatingGroups.Columns.Add(AddDGComboBoxColumn(_node.ChildNodes, labelchild, table, row));
                    }
                    else if (type.ToUpper() == "DATE")
                    {
                        dgRepeatingGroups.Columns.Add(AddDataGridDatePickerColumn(labelchild, "datepicker", table, row, datavalue));
                    }

                }
            }
            dgRepeatingGroups.Columns.Add(AddDataGridAddActionButtonColumn("Add Group", table));
            //dgRepeatingGroups.Columns.Add(AddDataGridRemoveActionButtonColumn("Remove Group", table, row));
            dgRepeatingGroups.Background = new SolidColorBrush(Colors.LightSkyBlue);
            dgRepeatingGroups.AlternatingRowBackground = new SolidColorBrush(Colors.LightCyan);
            table.AcceptChanges();
            dgRepeatingGroups.ItemsSource = table.DefaultView;
            
                        return dgRepeatingGroups;
        }


Если я получу ответ на то, как изменить выбранное значение ComboBox, генерируемое через DataGridTemplateColumn во второй строке, даже это будет большим подспорьем...

1 Ответов

Рейтинг:
2

DevD9

Я нашел решение. Вот он.

Обновленные методы C#.

private DataGridTemplateColumn AddDataGridComboBoxColumn(XmlNodeList _childnodeList, string header, DataTable table, DataRow row , string data = "")
        {
            DataGridTemplateColumn column = new DataGridTemplateColumn();
                var comboTemplate = new FrameworkElementFactory(typeof(ComboBox));
                List<string> items = new List<string>();
                for (int count = 0; count < _childnodeList.Count; count++)
                {
                    items.Add(_childnodeList.Item(count).InnerText.ToString());
                }

                Binding bind = new Binding(header);
                bind.Mode = BindingMode.TwoWay;


                comboTemplate.SetValue(ComboBox.ItemsSourceProperty, items);
                comboTemplate.SetBinding(ComboBox.SelectedValueProperty, bind);
                column.Header = header;
                column.CellTemplate = new DataTemplate() { VisualTree = comboTemplate };
                column.CellEditingTemplate = new DataTemplate() { VisualTree = comboTemplate };

                DataColumn dtcolumn = new DataColumn();
                dtcolumn.Caption = header;
                dtcolumn.ColumnName = header;
                table.Columns.Add(dtcolumn);
                row[header] = items;
           return column;
        }

private DataGrid CreatedRepeatingGroupDataGrid(XmlNodeList _childnodeList, string data)
        {
            DataTable table = new DataTable();
            
            dgRepeatingGroups = new DataGrid();
            dgRepeatingGroups.AutoGenerateColumns = false;
            dgRepeatingGroups.CanUserAddRows = true;
            dgRepeatingGroups.CanUserDeleteRows = true;
            dgRepeatingGroups.HorizontalAlignment = HorizontalAlignment.Left;

            if (data != "")
            {
                string[] arrayofRowdata = data.Split(System.Environment.NewLine.ToCharArray());
                
                for (int i = 0; i < arrayofRowdata.Length; i++)
                {
                    
                    if (arrayofRowdata[i] != "")
                    {
                        if (i == 0)
                        {
                            DataRow row = table.NewRow();
                            
                            foreach (XmlNode _node in _childnodeList)
                            {
                                string id = _node.Attributes.Item(0).Value;
                                string labelchild = _node.Attributes.Item(1).Value;
                                string type = _node.Attributes.Item(2).Value;
                                string datavalue = string.Empty;

                                string[] arrayofdata = arrayofRowdata[i].Split(';');

                                for (int i1 = 0; i1 < arrayofdata.Length; i1++)
                                {
                                    if (arrayofdata[i1].Contains(labelchild.Replace(".", "")))
                                    {
                                        datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' ');
                                        break;
                                    }
                                }


                                if (type.ToUpper() == "DECIMAL" || type.ToUpper() == "STRING")
                                {
                                    dgRepeatingGroups.Columns.Add(AddDataGridTextColumn(labelchild, table, row, datavalue));

                                }

                                else if (type.ToUpper() == "COMBO")
                                {
                                    dgRepeatingGroups.Columns.Add(AddDataGridComboBoxColumn(_node.ChildNodes, labelchild, table, row, datavalue));
                                                                    }
                                else if (type.ToUpper() == "DATE")
                                {
                                    dgRepeatingGroups.Columns.Add(AddDataGridDatePickerColumn(labelchild, "datepicker", table, row, datavalue));
                                }
                               row[labelchild] = datavalue;
                            }
                        table.Rows.Add(row);
                        
                        }
                        else
                        {
                            DataRow row = table.NewRow();
                                                        
                            foreach (XmlNode _node in _childnodeList)
                            {
                                string id = _node.Attributes.Item(0).Value;
                                string labelchild = _node.Attributes.Item(1).Value;
                                string type = _node.Attributes.Item(2).Value;
                                string datavalue = string.Empty;

                                string[] arrayofdata = arrayofRowdata[i].Split(';');

                                for (int i1 = 0; i1 < arrayofdata.Length; i1++)
                                {
                                    if (arrayofdata[i1].Contains(labelchild.Replace(".", "")))
                                    {
                                        datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' ');
                                        break;
                                    }
                                }

                                row[labelchild] = datavalue;
                              }
                            table.Rows.Add(row);
                            
                        }
                    }
                    
                }
            }
            else
            {
                DataRow row = table.NewRow();
                foreach (XmlNode _node in _childnodeList)
                {
                    string id = _node.Attributes.Item(0).Value;
                    string labelchild = _node.Attributes.Item(1).Value;
                    string type = _node.Attributes.Item(2).Value;
                    string datavalue = string.Empty;

                    string[] arrayofdata = data.Split(';');

                    for (int i1 = 0; i1 < arrayofdata.Length; i1++)
                    {
                        if (arrayofdata[i1].Contains(labelchild.Replace(".", "")))
                        {
                            datavalue = arrayofdata[i1].Replace(" " + labelchild.Replace(".", "") + " : ", "").ToString().TrimEnd(' ');
                            break;
                        }
                    }

                    if (type.ToUpper() == "DECIMAL" || type.ToUpper() == "STRING")
                    {
                        dgRepeatingGroups.Columns.Add(AddDataGridTextColumn(labelchild, table, row, datavalue));
                    }

                    else if (type.ToUpper() == "COMBO")
                    {
                        dgRepeatingGroups.Columns.Add(AddDataGridComboBoxColumn(_node.ChildNodes, labelchild, table, row, datavalue));
                                            }
                    else if (type.ToUpper() == "DATE")
                    {
                        dgRepeatingGroups.Columns.Add(AddDataGridDatePickerColumn(labelchild, "datepicker", table, row, datavalue));
                    }

                }
            }
            dgRepeatingGroups.Columns.Add(AddDataGridAddActionButtonColumn("Add Group", table));
            dgRepeatingGroups.Background = new SolidColorBrush(Colors.LightSkyBlue);
            dgRepeatingGroups.AlternatingRowBackground = new SolidColorBrush(Colors.LightCyan);
            table.AcceptChanges();
            dgRepeatingGroups.ItemsSource = table.DefaultView;
            return dgRepeatingGroups;
        }