Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除DataGridView列时出现意外结果_C# - Fatal编程技术网

C# 删除DataGridView列时出现意外结果

C# 删除DataGridView列时出现意外结果,c#,C#,在这个程序中,我创建了一个包含5列的数据表。这将是DataGridView的数据源。DataTable中的某些列不需要用户查看,但稍后程序将使用它们 在最后一行之后,列排列为:col2、col5、col1、col3、col4。为什么会这样?它不应该从DataGridView中删除吗?我应该怎么做才能使它显示为“col2,col5” 编辑:我想从DataGridView中删除一些列,但在DataTable中仍然可用。此外,它在事件内部工作(如单击按钮) 编辑:我仍然不明白为什么会发生这种情况。我别

在这个程序中,我创建了一个包含5列的数据表。这将是DataGridView的数据源。DataTable中的某些列不需要用户查看,但稍后程序将使用它们

在最后一行之后,列排列为:col2、col5、col1、col3、col4。为什么会这样?它不应该从DataGridView中删除吗?我应该怎么做才能使它显示为“col2,col5”

编辑:我想从DataGridView中删除一些列,但在DataTable中仍然可用。此外,它在事件内部工作(如单击按钮)

编辑:我仍然不明白为什么会发生这种情况。我别无选择,只能创建另一个线程(BackgroundWorker)来执行此操作

        DataTable dt = new DataTable();
        dt.Columns.Add("col1");
        dt.Columns.Add("col2");
        dt.Columns.Add("col3");
        dt.Columns.Add("col4");
        dt.Columns.Add("col5");
        dataGridView1.DataSource = dt;
        dataGridView1.Columns.RemoveAt(3);
        dataGridView1.Columns.RemoveAt(2);
        dataGridView1.Columns.RemoveAt(0);
据我所知,哈里斯·哈桑是对的;包含DataGridView的表单应至少出现一次。但是我仍然不明白为什么…

您可以使用DataGridView的属性对列进行排序。为了隐藏列,可以将特定列的可见属性设置为false

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        DataTable dt = new DataTable();
        int i;
        dataGridView1.Invoke((MethodInvoker)delegate
        {
            dt.Columns.Add("col1");
            dt.Columns.Add("col2");
            dt.Columns.Add("col3");
            dt.Columns.Add("col4");
            dt.Columns.Add("col5");
            dataGridView1.DataSource = dt;
            dataGridView1.Columns.RemoveAt(3);
            dataGridView1.Columns.RemoveAt(2);
            dataGridView1.Columns.RemoveAt(0);
        });
    }

您可以尝试设置列的可见性,而不是删除列

dataGridView1.Columns["ColumnTobeHided"].Visible = false;

据我所知,在删除任何列之前,必须显示DataGridView一次。尝试显示DataGridView一次,然后删除列,看看会发生什么情况

如果不希望表中所有列的列都在网格中,请在将datatable绑定到数据源之前将DataGridView.AutoGenerateColumns设置为false。然后创建并绑定实际需要的datagridview列


AutoGenerateColumns默认为true,但它很少给出我们真正想要的。花点时间完全按照您的需要构建datagridview列,不要相信默认处理。

但这是用来更改列排列的。我不想显示其他列。我使用了RemoveAt(),但它没有删除它们。那些“应该”删除的列刚刚移动到dataGridView1的末尾。如果我执行MessageBox.Show(dataGridView1.columns[0].Name);,则仍然是“col1”;。我在程序的另一部分使用了RemoveAt()。两者之间的唯一区别是我使用了另一个线程在DataTable中存储值。在那之后,我做了和上面一样的事情。奇怪的是,这一点起作用了。当您运行
MessageBox.Show(dataGridView1.Columns[0].Name)时它将是
col1
,只是因为您刚刚更改了可见性模式。我之前已经这样做了。我将代码放在按钮事件中删除列的位置,当我单击按钮时,这些列被删除。为什么在“dataGridView1.DataSource=dt;”下面删除列时不会发生这种情况?我不知道具体原因,但我知道会发生这种情况。您可以做的是处理一个事件,该事件在DataGridView显示时立即引发,并在该事件中删除columns@Gerald对不起,我真的很困惑。。。!你是说
RemoveAt
没有删除列吗?我在BackgroundWorker RunWorkerCompleted事件中调用的方法中使用了这段代码,它可以工作。当在表单的构造函数中时,相同的方法无法正常工作。。。如果未调用RunWorkerAsync(),是否可以在Backgroundworker RunWorkerCompleted中引发事件?@Knvn,是!我不知道为什么!显然,如果在事件发生时删除该列,它确实会删除该列。我不希望所有列都出现在DataGridView中,但我只希望其中一些列出现在DataGridView中。所谓“出现”,我的意思是从那里删除这些列,而不仅仅是隐藏它们……如果将AutoGenerateColumns设置为false,默认情况下将不会获得任何列。然后可以添加代码来创建所需的特定列。AutoGenerateColumns=true为DataTable中的每一列创建一个DGV列,这不是您想要的
        dataGridView1.DataSource = dt;
        dataGridView1.Columns[3].Visible = false;
        dataGridView1.Columns[2].Visible = false;
        dataGridView1.Columns[0].Visible = false;