【问题标题】:C# Populate Gridview from Dropdown choiceC# 从下拉选项中填充 Gridview
【发布时间】:2011-06-03 16:38:12
【问题描述】:

我已经尝试了所有方法,但无法弄清楚如何使用我的下拉选择填充网格视图。我检查了下拉列表的值,它是正确的,gridview 将显示所有项目,但不显示我想要的项目。我正在使用网络表单。下面是我的代码。

protected void Page_Load(object sender, EventArgs e)
        {
            Populate();
        }

        protected void btnDisplay_Click(object sender, EventArgs e)
        {
            SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
            myConnection.Open();

            try
            {
                SqlDataReader reader = null;
                string serverIP = drpChoose.SelectedItem.Value.ToString();
                SqlCommand cmd = new SqlCommand("SELECT * from ScheduledTasks WHERE ServerIP = " + serverIP, myConnection);

                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    GridView1.DataSource = reader;
                    GridView1.DataBind();
                }
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            myConnection.Close();
        }

        public void Populate()
        {
            SqlConnection myConnection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
            myConnection1.Open();

            SqlCommand cmd1 = new SqlCommand("SELECT ServerIP FROM Servers", myConnection1);
            SqlDataReader dropReader;
            dropReader = cmd1.ExecuteReader();

            drpChoose.DataSource = dropReader;
            drpChoose.DataTextField = "ServerIP";
            drpChoose.DataValueField = "ServerIP";
            drpChoose.DataBind();
        }
    }

任何帮助将不胜感激。

【问题讨论】:

  • 如果您使用的是 SQL Server,请使用存储过程,并带有与 SQLCommand 对象关联的实际参数。
  • 我开始为 serverIP 创建一个参数,然后将其设置为我的变量 serverIP。谢谢大家。

标签: c# asp.net gridview webforms drop-down-menu


【解决方案1】:

您还应该应用 sql 参数化。它将有助于防止 SQL 注入攻击。您的代码目前容易受到哪些攻击。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

【讨论】:

  • 我现在正在改变它。谢谢。
【解决方案2】:

您不需要在每次回帖后重新绑定下拉列表,否则您将丢失所选项目。试试下面的:

protected void Page_Load(object sender, EventArgs e)
        {
        if(!Page.IsPostBack)
            {
            Populate();                
            }

    }

    protected void btnDisplay_Click(object sender, EventArgs e)
    {
        SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
        myConnection.Open();

        try
        {
            SqlDataReader reader = null;
            string serverIP = drpChoose.SelectedItem.Value.ToString();
            SqlCommand cmd = new SqlCommand("SELECT * from ScheduledTasks WHERE ServerIP = " + serverIP, myConnection);

            reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                GridView1.DataSource = reader;
                GridView1.DataBind();
            }
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        myConnection.Close();
    }

    public void Populate()
    {
        SqlConnection myConnection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
        myConnection1.Open();

        SqlCommand cmd1 = new SqlCommand("SELECT ServerIP FROM Servers", myConnection1);
        SqlDataReader dropReader;
        dropReader = cmd1.ExecuteReader();

        drpChoose.DataSource = dropReader;
        drpChoose.DataTextField = "ServerIP";
        drpChoose.DataValueField = "ServerIP";
        drpChoose.DataBind();
    }
}

【讨论】:

  • 这仍然不起作用。我的网格没有显示。但是,当我将 SQL 命令更改为不带 WHERE 的 SELECT * FROM TABLE 时,它可以正常工作。
【解决方案3】:

只是一个指南:为什么不使用 Ajaxtoolkit UpdatePanel 控件。 将Gridview放到UpdatePanel中,然后将下拉选择设置为Gridview的Updatetrigger。这样就不用担心回发和值了。

【讨论】:

    【解决方案4】:

    将您的 Page_Load 方法更改为:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack()) {
            Populate();
        }
    }
    

    每次页面加载时,您都会重新绑定下拉选择,以便始终设置默认的“all”值。通过使用 Page.IsPostBack 属性,您可以告诉页面仅在第一次加载时绑定,而不是在后续回发时绑定。通过使用此属性,下拉列表中的选定项目不会在回发时更改。

    MSDN:Page.IsPostBack

    更新

    关于您对 SQL 语句中“Where”子句的评论,serverIP 是否以文本形式存储在数据库中?尝试将 serverIP 包装在撇号中,例如:

    SqlCommand cmd = new SqlCommand("SELECT * from ScheduledTasks WHERE ServerIP = '" + serverIP + "'', myConnection);
    

    【讨论】:

    • 我正在从 SQL 填充的下拉列表中获取 serverIP。字符串 serverIP = drpChoose.SelectedItem.Value.ToString();我已经测试了 serverIP 的值,它似乎工作正常。
    • 是的,但是 serverIP 如何存储在 SQL Server 中?它的数据类型是什么?
    • 我通过创建一个参数让它工作了。是的,它以文本形式存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多