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

鬼五拾柒 2015-03-26 06:14:33
如题,

我要将数据为0的列在DataTable中移除并更改列名, 要如何做判断
...全文
853 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2015-03-27
  • 打赏
  • 举报
回复
全隐藏,有一个不为0就显示
fengconnie 2015-03-27
  • 打赏
  • 举报
回复
看看是不是dt的结构在哪句话处理之后发生了变化。
fengconnie 2015-03-27
  • 打赏
  • 举报
回复
你看下,在DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");得到dt的时候是几列,列名都是什么。然后当循环体里删除这列的时候,dt里是否有这列。单点调试跟踪一下。
鬼五拾柒 2015-03-27
  • 打赏
  • 举报
回复
引用 12 楼 fengconnie 的回复:
你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。
我是Winform不是Asp.Net 再说我就放了个datagridview什么也没干
fengconnie 2015-03-27
  • 打赏
  • 举报
回复
还有,你在绑定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();
鬼五拾柒 2015-03-27
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
dt.Columns[i] 改成 dt.Columns[i].ColumnName 你这个代码逻辑就不对啊,怎么遍历两次dt.Columns呢,我的是遍历一遍
我改了还是报,某列不属于该Table
fengconnie 2015-03-27
  • 打赏
  • 举报
回复
比如说你这样设置

 <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就删除了里面其中的一列,就会报错。
fengconnie 2015-03-27
  • 打赏
  • 举报
回复
你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。
fengconnie 2015-03-27
  • 打赏
  • 举报
回复

 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);
            });
  • 打赏
  • 举报
回复
dt.Columns[i] 改成 dt.Columns[i].ColumnName 你这个代码逻辑就不对啊,怎么遍历两次dt.Columns呢,我的是遍历一遍
鬼五拾柒 2015-03-27
  • 打赏
  • 举报
回复
这是我的代码,但是会报错 某列不属于此表

            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];
}
software_artisan 2015-03-27
  • 打赏
  • 举报
回复
遍历所有列,合计是0就把该列Visible属性设为false
FTD_Fred 2015-03-27
  • 打赏
  • 举报
回复
i=4……手抖打错
FTD_Fred 2015-03-27
  • 打赏
  • 举报
回复
引用 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);
            });
从第五列开始判断该怎么写啊![/quote] 那你可以用for循环啊
for(int i=5;i<dt.rows.count;i++)
  • 打赏
  • 举报
回复
foreach (DataColumn col in dt.Columns)
改成
for (var i=4 ;i<dt.Columns.Count;i++)
{
 DataColumn col=dt.Columns[i];
}
鬼五拾柒 2015-03-27
  • 打赏
  • 举报
回复
引用 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);
            });
从第五列开始判断该怎么写啊!
  • 打赏
  • 举报
回复
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);
            });
  • 打赏
  • 举报
回复
你也可以设置哪些列是忽略不需要sum判断的,以避免不必要的错误
  • 打赏
  • 举报
回复
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);
            });

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧