简体   繁体   English

WinForms在datagridview中显示datagridview对象

[英]WinForms Display datagridview object in datagridview

I have several datagridview objects saved in a global dictionary. 我在全局字典中保存了几个datagridview对象。 I want to find a specific datagridview object and display it in a datagridview. 我想找到一个特定的datagridview对象,并将其显示在datagridview中。 Everything seems to work exept for the actual display. 一切似乎都可以正常显示。 Here is the code that is suppost to display 这是要显示的代码

if (seznamPodatkov.ContainsKey(tn.Text))
            {
                dataGridView1.DataSource = seznamPodatkov[tn.Text];

            }

Maybe I'm supposed to use the databind, but I don't know how to use it with many datagrid object, from which I get the right one. 也许我应该使用databind,但是我不知道如何将它与许多datagrid对象一起使用,从中我找到了正确的对象。

Edit: This code below saves datagridview objects, which should be later restored and displayed. 编辑:下面的这段代码保存了datagridview对象,应稍后将其还原并显示。 The datagridview changes depending on a treeview, if a node with childs is clicked, then first is checked if a gridview from this parent node already exists. datagridview会根据树视图而变化,如果单击了具有childs的节点,则首先检查该父节点的gridview是否已存在。 If it does, it should display that datagrid from dictionary, if not, it makes a new one and saves it to dictionary. 如果是这样,它将显示字典中的那个数据网格,否则,将显示一个新的并将其保存到字典中。

private Dictionary<string, DataGridView> seznamPodatkov;  

  if (tree1.SelectedNode == null) return;
            if(tree1.SelectedNode.GetNodeCount(false) > 0)
            {
                if (seznamPodatkov.ContainsKey(tree1.SelectedNode.Text))                              
                {
                    seznamPodatkov[tree1.SelectedNode.Text] = dataGridView1;
                }
                else seznamPodatkov.Add(tree1.SelectedNode.Text, dataGridView1);
            }

private void tree1_AfterSelect(object sender, TreeViewEventArgs e)                  
        {
            TreeNode tn = tree1.SelectedNode;
            if (tn == null) return;
            if (tn.GetNodeCount(false) > 0)
            {
                dataGridView1.Columns.Clear();

                if (seznamPodatkov.ContainsKey(tn.Text))
                {
                    dataGridView1.DataSource = seznamPodatkov[tn.Text];

                }
                else
                {
                    dataFill(tn);


                }
                dataGridView1.Show();

            }
            else dataGridView1.Hide();
        }     

Edit: 编辑:

I made some slight progress. 我取得了一些进展。 I tried it like this: 我这样尝试过:

      DataGridView dgv = new DataGridView();
        dgv.Columns.Add("something", "something");
        dgv.Columns.Add("something", "something");
        dgv.Columns.Add("something", "something");

        dataGridView1 = dgv;

datagridView1 seems to get the dvg columns, as I checked it with debugger. 正如我用调试器检查的那样,datagridView1似乎得到了dvg列。 I have no idea if this is even correct or not, because the dataGridView1 still doesn't display the table in forms. 我不知道这是否正确,因为dataGridView1仍然不以表格形式显示表格。

I handle things differently when I have such a need. 有这种需要时,我会采取不同的处理方式。 I use a custom TabControl that supports hiding the tabs, and couple that with a TreeView whose selection event controls which tab page is displayed. 我使用一个自定义的TabControl ,它支持隐藏选项卡,并将其与TreeView结合使用, TreeView的选择事件控制着显示哪个选项卡页面。

This provides the illusion of one view that switches with the tree selection, while in reality you would have multiple, separate controls on the form. 这提供了一个视图随树形选择切换的错觉,而实际上,您将在表单上拥有多个单独的控件。 This would allow you to do away with the Dictionary and simply bind each DataGridView directly to its data source. 这将使您不必使用Dictionary而只需将每个DataGridView直接绑定到其数据源即可。

I figured it out. 我想到了。 First I thought that it's that simple: dgv = dgv1 but it's not. 首先,我认为就是这么简单:dgv = dgv1,但事实并非如此。

Here is a test code that worked perferctly: 这是一个正常工作的测试代码:

 Dictionary<string, DataGridView> dic;
    public Form1()
    {
        InitializeComponent();

        dataGridView2.Columns.Add("nekaj", "nekaj");
        dataGridView2.Columns.Add("nekaj", "nekaj");
        dataGridView2.Columns.Add("nekaj", "nekaj");
        dataGridView2.Rows.Add("1", "2", "3");
        dataGridView2.Rows.Add("1", "2", "3");
        dataGridView2.Rows.Add("1", "2", "3");
        dic = new Dictionary<string, DataGridView>();
        dic.Add("test", dataGridView2);

    }


    private void button1_Click(object sender, EventArgs e)
    {

        foreach(DataGridViewColumn columns in dic["test"].Columns)
        {
            dataGridView1.Columns.Add(columns.Name, columns.HeaderText);
        }

        foreach(DataGridViewRow rows in dic["test"].Rows)
        {
            ArrayList list = new ArrayList();


          foreach(DataGridViewCell cell in rows.Cells)
            {
                list.Add(cell.Value);
            }

            dataGridView1.Rows.Add(list.ToArray());

        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM