当前位置:编程学习 > C#/ASP.NET >>

DataGridView中列顺序发生奇怪的变化,求高手解释!!

为了说明这个问题,我做了个小程序放在115网盘上:
IndexAdjustment.rar
http://u.115.com/file/bhdpz8vi#

程序连接到一个access数据库,数据库就2列,第一列是1 2 3 4 5 6 7,第二列是AAA BBB CCC DDD EEE FFF GGG。

整个程序有1个TabControl,两个TabPage,每个TabPage中包含一个DataGridView。

我在代码中动态的加入了一列,Name叫Image,按理说如果我不设定列序数的话,默认的Index应该是2(第三列,加在已有的2列之后),而实际上也是这样的。但是我一切换Tab之后,这个Index就自动变成0了(Image列跑到那2列数据列前面去了)!非常奇怪!

下面是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private testDataSet testDS = new testDataSet();

        private BindingSource BS_1;
        private BindingSource BS_2;
        private testDataSetTableAdapters.Table1TableAdapter TA;
        private DataGridViewImageColumn ImageColumn;
        
        private void Form1_Load(object sender, EventArgs e)
        {
            // 初始化 BindingSource
            BS_1 = new BindingSource(testDS, "Table1");
            BS_2 = new BindingSource(testDS, "Table1");
            // 初始化 TableAdapter
            TA = new WindowsFormsApplication2.testDataSetTableAdapters.Table1TableAdapter();
            TA.Fill(this.testDS.Table1);
            // 连接DGV到BindingSource
            dataGridView1.DataSource = BS_1;
            dataGridView2.DataSource = BS_2;
            // 初始化全部DGV
            Initial_DGV(dataGridView1);
            Initial_DGV(dataGridView2);
            textBox1.Text = dataGridView1.Columns[0].Name;
            textBox2.Text = dataGridView1.Columns[1].Name;
            textBox3.Text = dataGridView1.Columns[2].Name;

            textBox4.Text = dataGridView2.Columns[0].Name;
            textBox5.Text = dataGridView2.Columns[1].Name;
            textBox6.Text = dataGridView2.Columns[2].Name;

        }

        private void Initial_DGV(DataGridView _DGV)
        {

            ImageColumn = new DataGridViewImageColumn();//定义一个新的image列
            _DGV.Columns.Add(ImageColumn); //把这个新的image列加入_DGV_PMList_National中
            ImageColumn.Name = "Image"; // 名字设为“Image”
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = dataGridView1.Columns[0].Name;
                textBox2.Text = dataGridView1.Columns[1].Name;
                textBox3.Text = dataGridView1.Columns[2].Name;

                textBox4.Text = dataGridView2.Columns[0].Name;
                textBox5.Text = dataGridView2.Columns[1].Name;
                textBox6.Text = dataGridView2.Columns[2].Name;
            }
            catch { }
        }

        private void dataGridView2_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = dataGridView1.Columns[0].Name;
                textBox2.Text = dataGridView1.Columns[1].Name;
                textBox3.Text = dataGridView1.Columns[2].Name;

                textBox4.Text = dataGridView2.Columns[0].Name;
                textBox5.Text = dataGridView2.Columns[1].Name;
                textBox6.Text = dataGridView2.Columns[2].Name;
            }
            catch { }
        }

    }
}


为了看得清楚,我加了6个TextBox,分别显示每一列的Name。只要一切换Tab,顺序就变了!我说可能不那么直观,如果各位可以下载一下115网盘的程序就能明白我的意思了,程序一共228KB,非常小……

我是新手,麻烦大家了! --------------------编程问答-------------------- SortOrder 改成null --------------------编程问答--------------------
引用 1 楼 colinfang2006 的回复:
SortOrder 改成null


DataGridView.SortOrder是只读…… --------------------编程问答-------------------- 没遇到,帮顶 --------------------编程问答-------------------- 求高手解释…… --------------------编程问答--------------------
试下在创建列的时候,给它的index赋值。 --------------------编程问答--------------------
引用 5 楼 lpingz 的回复:
试下在创建列的时候,给它的index赋值。


尝试过,Index只读,DisplayIndex只影响显示时的位置,并不影响实际内存中顺序。 --------------------编程问答-------------------- 学习中,
我最近也碰到这个问题,DataGridViewLinkColumn列总是自动的跑到最前面,调整后也没用,只要一编译,又自动打乱列的顺序,求高手!!! --------------------编程问答-------------------- 请各位关注! --------------------编程问答--------------------
引用 7 楼 plw01930 的回复:
学习中,
我最近也碰到这个问题,DataGridViewLinkColumn列总是自动的跑到最前面,调整后也没用,只要一编译,又自动打乱列的顺序,求高手!!!


感谢帮顶

我现在用这个土办法:手动在Design视图中把每个DataGridView中都加入一个ImageColumn(你的话就是LinkColumn),然后在代码中通过DisplayIndex来调整位置……

不过,这个方法很易做图,没有从根本上解决这个问题。还是等高人吧…… --------------------编程问答-------------------- 楼主,我好像找到原因了:
1) 由于我引用了第三方控件(类似datagridview)导致,卸载后就正常了。
------------------------------------------------------------
楼主用c# winform 写哪方面的应用,能告之吗?哈。。。 --------------------编程问答--------------------
引用 10 楼 plw01930 的回复:
楼主,我好像找到原因了:
1) 由于我引用了第三方控件(类似datagridview)导致,卸载后就正常了。
------------------------------------------------------------
楼主用c# winform 写哪方面的应用,能告之吗?哈。。。


我没有安装除了Visual Studio 2008以外任何其他插件,这是你要问的问题吗? --------------------编程问答--------------------  private void Initial_DGV(DataGridView _DGV)
        {

            ImageColumn = new DataGridViewImageColumn();//定义一个新的image列
            _DGV.Columns.Add(ImageColumn); //把这个新的image列加入_DGV_PMList_National中
            ImageColumn.Name = "Image"; // 名字设为“Image”
        }

给他的列displayIndex设为2  还有 你到前台看下  现有的2个的displayIndex是不是0跟1 --------------------编程问答--------------------
引用 12 楼 zjailanzj 的回复:
 private void Initial_DGV(DataGridView _DGV)
        {

            ImageColumn = new DataGridViewImageColumn();//定义一个新的image列
            _DGV.Columns.Add(ImageColumn); //把这个新的image列加入_DGV_PMLis……



是0和1,但是设置DisplayIndex没有用,照样在切换Tab之后顺序发生错乱。

(PS - 如果你把DisplayIndex设置成0的话,原本的0和1会自动往后顺延1,变成1和2) --------------------编程问答-------------------- 求教…… --------------------编程问答-------------------- 求高手帮忙啊…… --------------------编程问答-------------------- 楼主问题解决了么????
我也遇到了同样的问题,我把
SELECT 型号,类型,特征,状态,..... From table1;
都设定了之后,还是有问题!求解! --------------------编程问答-------------------- 没解决……还在纠结呢……估计大家都不明白吧…… --------------------编程问答-------------------- DataGridView中的列不管你是手动编辑列还是绑定数据源后自动生成的列 
如果你是通过
DataGridView.Columns[i].Name 来获得列的话,顺序会根据以下情况变更的
1、如果没有实体类 则根据你的查询语句中的列的顺序是一样的
2、如果有实体类,比如DataGridView数据源是List<Student>(Student是实体类)则得到的顺序和实体类中的属性的顺序一致。 --------------------编程问答-------------------- 将DataGridView的AutoGenerateColumns的值设为false 试试
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,