DataTable中如果某列数据全部为0,则不显示那一列,该怎么做

时间:2021-09-09 19:27:14
如题,
DataTable中如果某列数据全部为0,则不显示那一列,该怎么做
我要将数据为0的列在DataTable中移除并更改列名,  要如何做判断

20 个解决方案

#1


List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
                list.Add(col.ColumnName);
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

#2


你也可以设置哪些列是忽略不需要sum判断的,以避免不必要的错误

#3


foreach循环里面if外面的list.Add代码要移除掉,那个是给别人写的例子上用到的
List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

#4


引用 3 楼 starfd 的回复:
foreach循环里面if外面的list.Add代码要移除掉,那个是给别人写的例子上用到的
List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

从第五列开始判断该怎么写啊!

#5


foreach (DataColumn col in dt.Columns)

改成
for (var i=4 ;i<dt.Columns.Count;i++)
{
 DataColumn col=dt.Columns[i];
}

#6


引用 4 楼 u011683479 的回复:
Quote: 引用 3 楼 starfd 的回复:

foreach循环里面if外面的list.Add代码要移除掉,那个是给别人写的例子上用到的
List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

从第五列开始判断该怎么写啊!

那你可以用for循环啊
for(int i=5;i<dt.rows.count;i++)

#7


i=4……手抖打错

#8


遍历所有列,合计是0就把该列Visible属性设为false

#9


这是我的代码,但是会报错 某列不属于此表

            DateTime kssj = this.dtpKSSJ.Value;
            DateTime jssj = this.dtpJSSJ.Value;
            TimeSpan ts = jssj - kssj;
            int days = ts.Days;
            DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");
            foreach (DataColumn dc in dt.Columns)
            {
                for (int i = 4; i < dt.Columns.Count; i++)
              {
                        object obj = dt.Compute("sum(" + dt.Columns[i] + ")", "TRUE");
                        float tmpInt;
                        if (float.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                        {
                            dt.Columns.Remove(dc.ColumnName);
                        }
                        else
                        {                 
                            for (int d = 0; d <= days; d++)
                            {
                                if (dc.ColumnName != kssj.AddDays(d).ToString("MM月dd日"))
                                {
                                    dc.ColumnName = kssj.AddDays(d).ToString("MM月dd日");
                                }
                                else 
                                {
                                    return;
                                }

                            }
                        }
                    }
                
                this.dataGridView1.DataSource = dt;
            }



引用 5 楼 starfd 的回复:
foreach (DataColumn col in dt.Columns)

改成
for (var i=4 ;i<dt.Columns.Count;i++)
{
 DataColumn col=dt.Columns[i];
}

#10


dt.Columns[i]
改成
dt.Columns[i].ColumnName

你这个代码逻辑就不对啊,怎么遍历两次dt.Columns呢,我的是遍历一遍

#11



 List<string> list = new List<string>();
            for (int i = 4; i < dt.Columns.Count; i++)
            {
                DataColumn col = dt.Columns[i];
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

#12


你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。

#13


比如说你这样设置

 <asp:GridView ID="GvData" Width="100%" runat="server" AutoGenerateColumns="False" EnableModelValidation="True">
            <Columns>
                <asp:BoundField HeaderText="col0" DataField="col0" />
                <asp:BoundField HeaderText="col1" DataField="col1" />
                <asp:BoundField HeaderText="col2" DataField="col2" />
                <asp:BoundField HeaderText="col3" DataField="col3" />
                <asp:BoundField HeaderText="col4" DataField="col4" />
                <asp:BoundField HeaderText="col5" DataField="col5" />
                <asp:BoundField HeaderText="col6" DataField="col6" />
                <asp:BoundField HeaderText="col7" DataField="col7" />
                <asp:BoundField HeaderText="col8" DataField="col8" />
                <asp:BoundField HeaderText="col9" DataField="col9" />
            </Columns>
        </asp:GridView>

标记<Columns>里的列如果DataField属性有设定,而你在绑定datagrid前,dt就删除了里面其中的一列,就会报错。

#14


引用 10 楼 starfd 的回复:
dt.Columns[i]
改成
dt.Columns[i].ColumnName

你这个代码逻辑就不对啊,怎么遍历两次dt.Columns呢,我的是遍历一遍

我改了还是报,某列不属于该Table

#15


还有,你在绑定GRIDVIEW的时候,应该写在FOR循环外面,你那么写,不是在反复绑定吗?
我给你想个办法来解决这个问题。

List<string> list = new List<string>();
            List<string> headerTextList = new List<string>();
            for (int i = 4; i < dt.Columns.Count; i++)
            {
                DataColumn col = dt.Columns[i];
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                    headerTextList.Add(this.GvData.Columns[i].HeaderText);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

            for (int i = 0; i < this.GvData.Columns.Count; i++)
            {
                if (headerTextList.FindIndex(delegate(string headerText) { return headerText == this.GvData.Columns[i].HeaderText; }) > -1)
                {
                    this.GvData.Columns.RemoveAt(i);
                }
            }

            this.GvData.DataSource = dt;
            this.GvData.DataBind();

#16


引用 12 楼 fengconnie 的回复:
你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。

我是Winform不是Asp.Net 再说我就放了个datagridview什么也没干

#17


你看下,在DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");得到dt的时候是几列,列名都是什么。然后当循环体里删除这列的时候,dt里是否有这列。单点调试跟踪一下。

#18


看看是不是dt的结构在哪句话处理之后发生了变化。

#19


全隐藏,有一个不为0就显示

#1


List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
                list.Add(col.ColumnName);
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

#2


你也可以设置哪些列是忽略不需要sum判断的,以避免不必要的错误

#3


foreach循环里面if外面的list.Add代码要移除掉,那个是给别人写的例子上用到的
List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

#4


引用 3 楼 starfd 的回复:
foreach循环里面if外面的list.Add代码要移除掉,那个是给别人写的例子上用到的
List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

从第五列开始判断该怎么写啊!

#5


foreach (DataColumn col in dt.Columns)

改成
for (var i=4 ;i<dt.Columns.Count;i++)
{
 DataColumn col=dt.Columns[i];
}

#6


引用 4 楼 u011683479 的回复:
Quote: 引用 3 楼 starfd 的回复:

foreach循环里面if外面的list.Add代码要移除掉,那个是给别人写的例子上用到的
List<string> list = new List<string>();
            foreach (DataColumn col in dt.Columns)
            {
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

从第五列开始判断该怎么写啊!

那你可以用for循环啊
for(int i=5;i<dt.rows.count;i++)

#7


i=4……手抖打错

#8


遍历所有列,合计是0就把该列Visible属性设为false

#9


这是我的代码,但是会报错 某列不属于此表

            DateTime kssj = this.dtpKSSJ.Value;
            DateTime jssj = this.dtpJSSJ.Value;
            TimeSpan ts = jssj - kssj;
            int days = ts.Days;
            DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");
            foreach (DataColumn dc in dt.Columns)
            {
                for (int i = 4; i < dt.Columns.Count; i++)
              {
                        object obj = dt.Compute("sum(" + dt.Columns[i] + ")", "TRUE");
                        float tmpInt;
                        if (float.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                        {
                            dt.Columns.Remove(dc.ColumnName);
                        }
                        else
                        {                 
                            for (int d = 0; d <= days; d++)
                            {
                                if (dc.ColumnName != kssj.AddDays(d).ToString("MM月dd日"))
                                {
                                    dc.ColumnName = kssj.AddDays(d).ToString("MM月dd日");
                                }
                                else 
                                {
                                    return;
                                }

                            }
                        }
                    }
                
                this.dataGridView1.DataSource = dt;
            }



引用 5 楼 starfd 的回复:
foreach (DataColumn col in dt.Columns)

改成
for (var i=4 ;i<dt.Columns.Count;i++)
{
 DataColumn col=dt.Columns[i];
}

#10


dt.Columns[i]
改成
dt.Columns[i].ColumnName

你这个代码逻辑就不对啊,怎么遍历两次dt.Columns呢,我的是遍历一遍

#11



 List<string> list = new List<string>();
            for (int i = 4; i < dt.Columns.Count; i++)
            {
                DataColumn col = dt.Columns[i];
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

#12


你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。

#13


比如说你这样设置

 <asp:GridView ID="GvData" Width="100%" runat="server" AutoGenerateColumns="False" EnableModelValidation="True">
            <Columns>
                <asp:BoundField HeaderText="col0" DataField="col0" />
                <asp:BoundField HeaderText="col1" DataField="col1" />
                <asp:BoundField HeaderText="col2" DataField="col2" />
                <asp:BoundField HeaderText="col3" DataField="col3" />
                <asp:BoundField HeaderText="col4" DataField="col4" />
                <asp:BoundField HeaderText="col5" DataField="col5" />
                <asp:BoundField HeaderText="col6" DataField="col6" />
                <asp:BoundField HeaderText="col7" DataField="col7" />
                <asp:BoundField HeaderText="col8" DataField="col8" />
                <asp:BoundField HeaderText="col9" DataField="col9" />
            </Columns>
        </asp:GridView>

标记<Columns>里的列如果DataField属性有设定,而你在绑定datagrid前,dt就删除了里面其中的一列,就会报错。

#14


引用 10 楼 starfd 的回复:
dt.Columns[i]
改成
dt.Columns[i].ColumnName

你这个代码逻辑就不对啊,怎么遍历两次dt.Columns呢,我的是遍历一遍

我改了还是报,某列不属于该Table

#15


还有,你在绑定GRIDVIEW的时候,应该写在FOR循环外面,你那么写,不是在反复绑定吗?
我给你想个办法来解决这个问题。

List<string> list = new List<string>();
            List<string> headerTextList = new List<string>();
            for (int i = 4; i < dt.Columns.Count; i++)
            {
                DataColumn col = dt.Columns[i];
                object obj = dt.Compute("sum(" + col.ColumnName + ")", "TRUE");
                int tmpInt;
                if (int.TryParse(obj.ToString(), out tmpInt) && tmpInt == 0)
                {
                    list.Add(col.ColumnName);
                    headerTextList.Add(this.GvData.Columns[i].HeaderText);
                }
            }
            list.ForEach(x =>
            {
                dt.Columns.Remove(x);
            });

            for (int i = 0; i < this.GvData.Columns.Count; i++)
            {
                if (headerTextList.FindIndex(delegate(string headerText) { return headerText == this.GvData.Columns[i].HeaderText; }) > -1)
                {
                    this.GvData.Columns.RemoveAt(i);
                }
            }

            this.GvData.DataSource = dt;
            this.GvData.DataBind();

#16


引用 12 楼 fengconnie 的回复:
你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。

我是Winform不是Asp.Net 再说我就放了个datagridview什么也没干

#17


你看下,在DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");得到dt的时候是几列,列名都是什么。然后当循环体里删除这列的时候,dt里是否有这列。单点调试跟踪一下。

#18


看看是不是dt的结构在哪句话处理之后发生了变化。

#19


全隐藏,有一个不为0就显示

#20


#21