добавить строку в datagridview, установив флажок дочернего узла в древовидном представлении

Я новичок в C # и работаю над первым проектом.

У меня есть WINFORM, который отображает treenode и datagridview. Я хочу, чтобы выбранные элементы из treenode перешли в datagridview. Если я выберу родительский узел treenode, все дочерние элементы перейдут в datagridview, но если я просто разверну родительский узел и выберу одного из дочерних, ничего не перейдет в datagrid. (выбор treenode запускает метод для получения атрибутов элемента из таблицы sql, и это атрибуты, которые переходят в сетку + значение узла)

Когда выбран родительский элемент, 'if (e.Node.Nodes.Count> 0)' истинно. Когда родительский элемент не выбран, но дочерний элемент, if (e.Node.Nodes.Count> 0) является ложным.

Итак, мой вопрос: какой код мне нужен, чтобы найти дочерние узлы, которые отмечены / не отмечены?

Как только я получу правильный код для проверки дочернего узла, какой код перемещает его в сетку данных или удаляет из сетки данных, если дочерний узел не отмечен?

   private void getChildNodesToGrid()
    {
        // get all child nodes add to dataGridView
        DataTable dt = getFieldsTable();
        dgvColumns.DataSource = dt;
        getAttributeSIDs();
    }

private void tvFileMan_AfterCheck(object sender, TreeViewEventArgs e)
    {
        getFileAndColumns();
        if (e.Node.Nodes.Count > 0)
        {
           this.CheckAllChildNodes(e.Node, e.Node.Checked);
            // Checked a file so get fields and check all fields except subfiles.
            // Use this event handler to process actions from check box click
            e.Node.Expand();
            foreach (TreeNode tn in e.Node.Nodes)
            {
                if (tn.Nodes.Count.Equals(0))
                    tn.Checked = e.Node.Checked;
            }
            getChildNodesToGrid();
 }       

Спасибо, но все это у меня уже есть, и я собираю все узлы в сетку. Проблема, с которой я столкнулся, заключается в ограничении проверенных дочерних узлов от filNode.Nodes. Я играл с «if (fileNode.Checked)», но это никогда не правда, хотя я могу распечатать его в немедленном окне

?fileNode.Nodes[2]
{Text = "1  - CARD COLOR"}
    base: {Text = "1  - CARD COLOR"}
    BackColor: "{Name=0, ARGB=(0, 0, 0, 0)}"
    Bounds: {X = 76 Y = 176 Width = 92 Height = 16}
    Checked: true





  private DataTable getFieldsTable()
    {
        //original
        DataTable dt = new DataTable();
        dt.Columns.Add("ColumnName");
        dt.Columns.Add("FMFieldName");
.
.
.
        dt.Columns.Add("PointsToFileNumber");
        TreeNode fileNode = tvFileMan.SelectedNode;
        foreach (TreeNode tn in fileNode.Nodes)
        {
            if (tn.Nodes.Count == 0)
            {   
                if (fileNode.Checked)
                {
                 DataRow dr = dt.NewRow();

                dr["FMFieldName"] = tn.Text.Substring(tn.Text.IndexOf("  - ") + 4);
                dr["FMFieldNumber"] = tn.Tag.ToString();
                dr["FMFileNumber"] = tn.Parent.Tag.ToString();
                dr["ColumnName"] = suggestName(tn.Text.Substring(tn.Text.IndexOf("  - ") + 4));
                //added by TEA 9/3/14 to get PointsToFileNumber in TreeNode
                if (dr["PointsToFileNumber"].ToString().Length > 0)
                {
                    dr["ColumnName"] = suggestName(tn.Text.Substring(tn.Text.IndexOf("  - ") + 4) + "txt");
                }
                dt.Rows.Add(dr);
                }
            }
        }
        return dt;

    }

person Thomas Ash    schedule 10.09.2014    source источник


Ответы (2)


Сделайте Datatable частной переменной-членом и добавляйте к ней записи, когда отмечены родительские узлы:

//The DataTable is now a private member variable and is accessible in the tvFileMan_AfterCheck event 
private DataTable dt = getFieldsTable();

private void getChildNodesToGrid()
   {
        dgvColumns.DataSource = dt; //this binds the DataTable to the GridView
        getAttributeSIDs();
    }

private void tvFileMan_AfterCheck(object sender, TreeViewEventArgs e)
    {
        getFileAndColumns();
        if (e.Node.Nodes.Count > 0)
        {
           this.CheckAllChildNodes(e.Node, e.Node.Checked);
            e.Node.Expand();
            foreach (TreeNode tn in e.Node.Nodes)
            {
                if (tn.Nodes.Count.Equals(0))
                    tn.Checked = e.Node.Checked;
            }

            //HERE Add the treenode(s) to the DataTable
            DataRow dr = dt.NewRow();
            dr[0] = "e.Node.Text";
            dt.Rows.Add(dr);

            getChildNodesToGrid();
 }       
person Jeremy Thompson    schedule 10.09.2014
comment
Спасибо, но таблица уже закрыта и данные уже добавляются. Я отредактировал свою проблему выше, чтобы показать datatable и то, где у меня возникли трудности. - person Thomas Ash; 11.09.2014

В AfterCheck добавлено 'else', поэтому он просто вызывает getChildNodesToGrid ()

Затем я обновил частную таблицу DataTable getFieldsTable (), чтобы добавить счетчик и условие if (fileNode.Nodes [cnt] .Checked) ». Опять же, я не знаю, правильное ли это программирование, но, похоже, работает.

    private void tvFileMan_AfterCheck(object sender, TreeViewEventArgs e)
    {
        getFileAndColumns();
        if (e.Node.Nodes.Count > 0)
        {
           //this.CheckAllChildNodes(e.Node, e.Node.Checked);
            // Checked a file so get fields and check all fields except subfiles.
            e.Node.Expand();
            foreach (TreeNode tn in e.Node.Nodes)
            {
                if (tn.Nodes.Count.Equals(0))
                    tn.Checked = e.Node.Checked;
            }
            getChildNodesToGrid();
        }
        else
        {
            e.Node.Expand();

                //if (tn.Nodes.Count.Equals(0))
                if (e.Node.Checked)
                {
                    //tn.Checked = e.Node.Checked;
                    getChildNodesToGrid();
                }

        }

   private DataTable getFieldsTable()
    {
        //original
        DataTable dt = new DataTable();
        dt.Columns.Add("ColumnName");
        dt.Columns.Add("FMFieldName");
        dt.Columns.Add("FMFieldNumber");
        dt.Columns.Add("FMFileNumber");
        dt.Columns.Add("FMFieldType");
        dt.Columns.Add("ResolvedValue");
        dt.Columns.Add("PointsToFileNumber");
        TreeNode fileNode = tvFileMan.SelectedNode;
        int cnt = 0;
        foreach (TreeNode tn in fileNode.Nodes)
        {
            if (tn.Nodes.Count == 0)
            {   
                if (fileNode.Nodes[cnt].Checked)
                {
                 DataRow dr = dt.NewRow();

                dr["FMFieldName"] = tn.Text.Substring(tn.Text.IndexOf("  - ") + 4);
                dr["FMFieldNumber"] = tn.Tag.ToString();
                dr["FMFileNumber"] = tn.Parent.Tag.ToString();
                dr["ColumnName"] = suggestName(tn.Text.Substring(tn.Text.IndexOf("  - ") + 4));
                //added by TEA 9/3/14 to get PointsToFileNumber in DataGrid
                if (dr["PointsToFileNumber"].ToString().Length > 0)
                {
                    dr["ColumnName"] = suggestName(tn.Text.Substring(tn.Text.IndexOf("  - ") + 4) + "txt");
                }
                dt.Rows.Add(dr);
                }
                cnt++;
            }
        }
        return dt;

    }
   private void getFileAndColumns()
    {
        label4.Visible = false;
        label5.Visible = false;
        btAllFields.Visible = false;
        cbComputed.Checked = false;
        TreeNode node = tvFileMan.SelectedNode;
        if (node == null) return;
        // Is it a File or Field?
        if (node.Index == 0) return;

        if (node.Nodes.Count > 0)
        {
            // FileManFile selected.
            // Check AttributeMap for this file. If found, fill in textboxes with that info.

            // Otherwise, suggest a name for the table.
            tbFileNumber.Text = node.Tag.ToString();
            tbFileName.Text = node.Text.Substring(node.Text.IndexOf("  - ") + 4);
            tbTableName.Text = "xxxx." + (suggestName(tbFileName.Text) + "F" + tbFileNumber.Text.Replace('.', 'x'));
            label4.Text = "To select all fields push button to the right. \nOtherwise double-click fields to add them one at a time.";
            label4.Visible = true;
            btAllFields.Visible = true;
            dgvColumns.DataSource = null;
            dgvPKIENS.DataSource = getPKIENSTable();
            getPKIENSIDs();
        }
        else
        {
            // FileMan Field selected.
        }


    }
person Thomas Ash    schedule 11.09.2014