gpt4 book ai didi

c# - 当 DropDownList Filter 的值不是 ALL 时,如何删除 GridView 中的整个第一列?

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:34 25 4
gpt4 key购买 nike

我有以下复杂的 asp.net 代码结构:

  1. DropDownList 作为过滤器
  2. 转发器
  3. 在 Repeater 内部:我有 HiddenField 和 GridView

我想当 Filter 的值设置为 All 时,应该删除第一列。问题是我正在使用负责生成三个 GridView 的 StoredProcedure,这样我将 GridView 放在 Repeater 中。

ASP.NET 代码:

<asp:DropDownList ID="ddlDivision" runat="server" AppendDataBoundItems="True" 
AutoPostBack="True" DataSourceID="sqlDataSourceDivision" DataTextField="DivisionName"
DataValueField="DivisionName"
Width="275px" EnableViewState="False">
<asp:ListItem Value="%">All</asp:ListItem>
</asp:DropDownList>


<br /> <br />
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>

<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("GroupID")%>' />

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommandType="StoredProcedure" SelectCommand="kbiReport"
FilterExpression="[DivisionName] like '{0}%'">

<FilterParameters>
<asp:ControlParameter ControlID="ddlDivision" Name="DivisionName"
PropertyName="SelectedValue" Type="String" />
</FilterParameters>

<SelectParameters>
<%--ControlParameter is linked to the HiddenField above to generate different GridView based on different values
of GroupID--%>
<asp:ControlParameter ControlID="HiddenField1" Name="GroupID" PropertyName="Value" />
</SelectParameters>
</asp:SqlDataSource>
<div style="width:700px; overflow:auto; overflow-y:hidden;">

<asp:GridView ID="GridView1" runat="server"
AllowSorting="True"
CellPadding="3"
DataSourceID="SqlDataSource1"
ClientIDMode="Static" class="fixedTables" Width="600" AutoGenerateColumns="true"
AlternatingRowStyle-CssClass="alt"
RowStyle-HorizontalAlign="Center"
OnRowDataBound="GridView1_RowDataBound" OnPreRender="GridView1_PreRender" OnRowCreated="GridView1_RowCreated"
OnDataBound="GridView1_DataBound">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<HeaderStyle Font-Bold = "true" ForeColor="Black"/>
<Columns>
</Columns>
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#E9E7E2" />
<SortedAscendingHeaderStyle BackColor="#506C8C" />
<SortedDescendingCellStyle BackColor="#FFFDF8" />
<SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>
</div>
<br />
</ItemTemplate>
</asp:Repeater>

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT DISTINCT GroupID FROM courses">
</asp:SqlDataSource>

<%--Filtering by Division--%>
<asp:SqlDataSource ID="sqlDataSourceDivision" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT [DivisionName] FROM [Divisions]"></asp:SqlDataSource>

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{

//Repeater1.DataBind();


}


//protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
//{
// if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
// {
// GridView gv = e.Item.FindControl("GridView1") as GridView;
// if (gv != null)
// {

// gv.DataBind();
// if (ddlDivision.SelectedValue != "ALL")
// {
// if (gv.Columns.Count > 0)
// gv.Columns[0].Visible = false;
// else
// {
// gv.HeaderRow.Cells[0].Visible = false;
// foreach (GridViewRow gvr in gv.Rows)
// {
// gvr.Cells[0].Visible = false;
// }
// }
// }

// }
// }

//}



//protected void ddlDivision_SelectedIndexChanged(object sender, EventArgs e)
//{
// if (ddlDivision.SelectedItem.Text == "All")
// {
// GridView1.Columns[0].Visible = true;
// }
// else
// {
// GridView1.Columns[0].Visible = false;
// }
//}

//This method is for deleting the first column in the GridView
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
// e.Row.Cells[0].Visible = false; // hides the first column
}

protected void GridView1_DataBound(object sender, EventArgs e)
{
//GridView GridView1 = (GridView)sender;
//foreach (GridViewRow gvr in GridView1.Rows)
//{
// if (ddlDivision.SelectedValue != "All")
// {
// gvr.Cells[0].Visible = false;

// }
//}




}


//This function is for checking each cell in each row.
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//var gv = sender as GridView;
//if (ddlDivision.SelectedValue == "All")
// gv.Columns[0].Visible = false;

if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (TableCell c in e.Row.Cells)
{
// Check if the cell vlaue = Yes
// if it is Yes, the cell will be colored with Light Green
if (c.Text.Contains(", Yes"))
{
c.BackColor = System.Drawing.Color.LightGreen;
c.Text = "&bull;";
}
else if (c.Text.Contains(", NO"))
{

c.Text = "";
}
}
}

//The following is for changing the color of headers in each GridView based on the value of the HiddenFild
//BTW, the value of the HiddenField is the value of the GroupID in Group Table in the Database
else if (e.Row.RowType == DataControlRowType.Header)
{
switch (((HiddenField)((GridView)sender).Parent.FindControl("HiddenField1")).Value)
{
case "1":
for (int i = 4; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].BackColor = System.Drawing.Color.LightBlue;
break;

case "2":
for (int i = 4; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].BackColor = System.Drawing.Color.LightYellow;
break;

case "3":
for (int i = 4; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].BackColor = System.Drawing.Color.Orange;
break;
}
}

}


protected void GridView1_PreRender(object sender, EventArgs e)
{
var gv = sender as GridView;
if (gv.Rows.Count > 0)
{
gv.UseAccessibleHeader = true;
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
}
}

我做了很多尝试,但都失败了,正如您在上面的后台代码中看到的那样。最后一次尝试是:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
GridView gv = e.Item.FindControl("GridView1") as GridView;
if (gv != null)
{

gv.DataBind();
if (ddlDivision.SelectedValue != "ALL")
{
if (gv.Columns.Count > 0)
gv.Columns[0].Visible = false;
else
{
gv.HeaderRow.Cells[0].Visible = false;
foreach (GridViewRow gvr in gv.Rows)
{
gvr.Cells[0].Visible = false;
}
}
}

}
}

}

我失败了。 谁能帮我解决这个问题?

最佳答案

I want when the value of Filter is setting to All, the fist column should be removed.

如果是这种情况,您肯定想要这样:

if (ddlDivision.SelectedValue == "ALL") { // hide column 0 } 

而不是这个:

if (ddlDivision.SelectedValue != "ALL") { // hide column 0 } 

使用 gv.Columns[0].Visible = false; 应该可以正常工作假设你有一个正确的引用你的 gv 对象 and您的 GridView 将其 AutoGenerateColumns 属性设置为 false

您必须确保这一点,因为 AutoGenerateColumns="true" 是 GridView 默认值,在这种情况下,GridView.Columns.Count 将始终为 0。如果您尝试引用 .Columns[x] 它将抛出“索引超出范围”。异常。

更多信息在这里:https://stackoverflow.com/a/3819831/441574

更新:

当您使用 AutoGenerateColumns="true" 时,您可以使用 GridView 的 RowDataBound 事件隐藏您的列:

创建事件处理程序:

如果您的 GridView 是静态(在您的 .aspx 页面上声明),请将其添加到其声明中:OnRowDataBound="gv_RowDataBound"

如果您的 GridView 是以编程方式创建,请添加 RowDataBound 事件处理程序:gv.RowDataBound += new GridViewRowEventHandler(gv_RowDataBound);

然后添加您的 RowDataBound 事件:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{
...
if (e.Row.RowType != DataControlRowType.Pager)
{
if (ddlDivision.SelectedItem.Text != "ALL")
{
// only check for pager row, all other rows including header/footer should be hidden
e.Row.Cells[0].Visible = false;
}
}
...
}

关于c# - 当 DropDownList Filter 的值不是 ALL 时,如何删除 GridView 中的整个第一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8877291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com