我要将数据为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
从第五列开始判断该怎么写啊!
#5
foreach (DataColumn col in dt.Columns)
改成
for (var i=4 ;i<dt.Columns.Count;i++)
{
DataColumn col=dt.Columns[i];
}
#6
那你可以用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;
}
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呢,我的是遍历一遍
改成
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
比如说你这样设置
标记<Columns>里的列如果DataField属性有设定,而你在绑定datagrid前,dt就删除了里面其中的一列,就会报错。
<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
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
你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。
我是Winform不是Asp.Net 再说我就放了个datagridview什么也没干
#17
你看下,在DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");得到dt的时候是几列,列名都是什么。然后当循环体里删除这列的时候,dt里是否有这列。单点调试跟踪一下。
#18
看看是不是dt的结构在哪句话处理之后发生了变化。
#19
全隐藏,有一个不为0就显示
#21
#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
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
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;
}
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呢,我的是遍历一遍
改成
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
比如说你这样设置
标记<Columns>里的列如果DataField属性有设定,而你在绑定datagrid前,dt就删除了里面其中的一列,就会报错。
<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
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
你的datagridview的列是在前台手动设置,没用自动显示列吧。这样的话,如果前台设定的列在dt里被删除了,就会提示你说的错误。解决办法是,在dt删除列的同时,需要把gridview里相应的列给删除才可以。
我是Winform不是Asp.Net 再说我就放了个datagridview什么也没干
#17
你看下,在DataTable dt = SQLHelper.Select(kssj, jssj, "", "jl_rpt0040");得到dt的时候是几列,列名都是什么。然后当循环体里删除这列的时候,dt里是否有这列。单点调试跟踪一下。
#18
看看是不是dt的结构在哪句话处理之后发生了变化。
#19
全隐藏,有一个不为0就显示