繁体   English   中英

asp.net C#gridview计数始终为零

[英]asp.net C# gridview count always zero

我创建了一个按钮(称为“ SubmitButtonTournamentName”),该按钮使用来自sql数据库的信息填充了Gridview(称为“ GridViewTournaments”)(单击按钮后)。 此gridview显示了几个数据,并包括两个下拉列表,我可以在其中选择信息和一个复选框。 在gridview下方是一个提交按钮。

当我单击按钮时,我希望进行验证。 如果我在下拉列表之一中未选择任何选项,则应更改其颜色。 这是我的按钮处理程序,可以捕获按钮单击:

public void BtnHandler(Object sender, EventArgs e) {
        Button btn = (Button)sender;
        switch (btn.CommandName) {
        case "SubmitButtonTournamentName": {
           //fill GridViewTournaments
           // sql stuff...

           try {
                sqlConnection.Open();
                IDataReader dr = idbCommand.ExecuteReader();
                DataTable dt = new DataTable();
                dt.Load(dr);
                GridViewTournaments.DataSource = dt;
                GridViewTournaments.DataBind();
                dr.Close();
            } catch (Exception ex) {
                System.Diagnostics.Debug.WriteLine("error: " + ex);
            } finally {
                sqlConnection.Close();
            }
        }
        break;

        case "btnSubmitEntry": {
            //Here I try to validate the input
            bool formError = false;
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[5] { new DataColumn("tourn_name"), new DataColumn("start_date"), new DataColumn("status"), new DataColumn("choice"), new DataColumn("doublePartner") });

            int count = GridViewTournaments.Rows.Count;
            System.Diagnostics.Debug.WriteLine("gridview count: " + count);
            foreach (GridViewRow row in GridViewTournaments.Rows) {
                if (row.RowType == DataControlRowType.DataRow) {
                    CheckBox chkEntry = (row.Cells[5].FindControl("chkEntry") as CheckBox);
                    if (chkEntry.Checked) {
                        DropDownList choice = (row.Cells[3].FindControl("ddlChoice") as DropDownList);
                        DropDownList doublePartner = (row.Cells[4].FindControl("ddlDoublePartner") as DropDownList);
                        if (choice.SelectedValue.Equals("-1")) {
                            formError = true;
                            choice.BackColor = Color.Red;
                        }
                        if (doublePartner.SelectedValue.Equals("-1")) {
                            formError = true;
                            doublePartner.BackColor = Color.Red;
                        }
                        string name = row.Cells[0].Text;
                        string startDate = row.Cells[1].Text;//(row.Cells[1].FindControl("lblCountry") as Label).Text;
                        string status = row.Cells[2].Text;
                        dt.Rows.Add(name, startDate, status, choice, doublePartner);
                    }
                }
            }
            if (formError == false) {
                 Server.Transfer("ProccessEntry.aspx", true);
            }
            GridViewTournaments.DataSource = dt;
            GridViewTournaments.DataBind();
        }
        break;
        }
    }

如果单击“ btnSubmitEntry”,我尝试从gridview获取日期,更改颜色,然后使用更改的元素重写gridview。

这是我的表格:

 <asp:GridView ID="GridViewTournaments" HeaderStyle-BackColor="#3AC0F2" HeaderStyle-ForeColor="White"
            runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="tourn_name" HeaderText="Name" ItemStyle-Width="150" />
                <asp:BoundField DataField="start_date" HeaderText="Start date" ItemStyle-Width="150" />
                <asp:BoundField DataField="status" HeaderText="Status" ItemStyle-Width="150" />
                <asp:TemplateField HeaderText="choice">
                    <ItemTemplate>
                        <asp:Label ID="lblChoice" runat="server" Text='<%# Eval("choice") %>' Visible="false" />
                        <asp:DropDownList ID="ddlChoice" runat="server">
                            <asp:ListItem Text="Choose ..." Value="-1"></asp:ListItem>
                            <asp:ListItem Text="1st Choice" Value="1"></asp:ListItem>
                            <asp:ListItem Text="2nd Choice" Value="2"></asp:ListItem>
                            <asp:ListItem Text="3rd Choice" Value="3"></asp:ListItem>
                        </asp:DropDownList>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="doublePartner">
                    <ItemTemplate>
                        <asp:Label ID="lblDoublePartner" runat="server" Text='<%# Eval("doublePartner") %>' Visible="false" />
                        <asp:DropDownList ID="ddlDoublePartner" runat="server">
                            <asp:ListItem Text="Some name" Value="1"></asp:ListItem>
                        </asp:DropDownList>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Want to enter?">
                    <ItemTemplate>
                        <asp:Label ID="lblEnter" runat="server" Text='<%# Eval("enter") %>' Visible="false" />
                        <asp:CheckBox runat="server" ID="chkEntry" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:Button ID="btnSubmitEntry" runat="server" Text="Submit" CommandName="btnSubmitEntry" OnClick="BtnHandler" />

问题:

foreach循环不会通过gridview,因为看起来其中有零行。

我测试了代码,它返回零:

GridViewTournaments.Rows.Count

我认为的是,“ GridViewTournaments”未绑定到页面上下文,因此按钮处理程序不会从gridview获取信息。

我知道按钮会重新加载页面,但我希望绕过回发。

也许我的解决方案是非常规的,所以请告诉我我是否完全错误。

绑定GridView ,应将其包装在if(!Page.IsPostBack){}周围,​​以确保仅在页面加载时绑定它,而不是在每回发一次时都绑定它。此外,下面是一个完整的工作示例您正在尝试实现:

后面的代码:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public partial class GridViewValidation : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            this.BindData();
        }
    }

    private void BindData()
    {
        var u1 = new User { ID = 1, Name = "User1" };
        var u2 = new User { ID = 2, Name = "User2" };
        GridView1.DataSource = new List<User> { u1, u2 };
        GridView1.DataBind();
    }

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                DropDownList doublePartner = (row.Cells[2].FindControl("ddlDoublePartner") as DropDownList);
                doublePartner.BackColor = doublePartner.SelectedValue.Equals("-1") ? Color.Red : Color.Transparent;
            }
        }
    }
}

.ASPX:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="ID" />
        <asp:BoundField DataField="Name" />
                <asp:TemplateField HeaderText="doublePartner">
            <ItemTemplate>
                <asp:DropDownList ID="ddlDoublePartner" runat="server">
                    <asp:ListItem Text="Value -1" Value="-1"></asp:ListItem>
                    <asp:ListItem Text="Value 1" Value="1"></asp:ListItem>
                    <asp:ListItem Text="Value 2" Value="2"></asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />

输出:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM