【问题标题】:Rowfilter with multiple texboxes具有多个文本框的行过滤器
【发布时间】:2013-01-16 08:54:09
【问题描述】:

我想使用两个不同的文本框来过滤数据库中的信息,以显示棒球运动员的平均得分。选择 0,3 到 0,4 的示例,应显示得分在这些数字之间的玩家。

以下代码不起作用:

// Search for player, working
private void button1_Click(object sender, EventArgs e)
        {
            view.RowFilter = "LastName like '%" + textBox1.Text + "%'";
            if (textBox1.Text == "") view.RowFilter = string.Empty;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable datatable = new DataTable();
            SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Mattias\Dropbox\C#\Database\Baseball.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
            connection.Open();
            datatable.Load(new SqlCommand("select * from players", connection).ExecuteReader());
            dataGridView1.DataSource = view = datatable.DefaultView;
            connection.Close();
        }
// This button is not working
        private void button2_Click(object sender, EventArgs e)
        {
            decimal minimum = Convert.ToDecimal(textBox2.Text);
            decimal maximum = Convert.ToDecimal(textBox3.Text);
// Should display players with different scores
            view.RowFilter = String.Format("BattingAverage >= {0} AND BattingAverage <= {1}"
                , minimum, maximum);

            if (textBox2.Text == "") view.RowFilter = string.Empty;
            if (textBox3.Text == "") view.RowFilter = string.Empty;
        }

【问题讨论】:

    标签: c# sql datagrid rowfilter


    【解决方案1】:

    RowFilter 不支持BETWEEN 运算符。它也不支持像您这样的完整 sql 查询。但是,您可以在此处指定 WHERE-clause 来过滤视图的行:

    view.RowFilter = String.Format(CultureInfo.InvariantCulture.NumberFormat,
                     "BattingAverage >= {0} AND BattingAverage <= {1}", minimum, maximum);
    

    我在String.Format 中使用了InvariantCulture.NumberFormat 来确保RowFilter 中的英文格式(点作为小数分隔符),这是必需的。

    请注意,您还使用撇号包装了这些值,这在数字上是不允许的,并且您使用 textBox2.Text 作为最小最大值的输入。

    【讨论】:

    • 感谢您的回答,但不幸的是代码不起作用。我修复了 textBox2.Text(maximum) 的名称,新代码给出了以下错误:表达式中的语法错误
    • “不起作用”是什么意思?引发语法错误的更正代码是什么?用户输入什么数字,带小数位?
    • 抛出语法错误的代码是:view.RowFilter = string.Format("BattingAverage >= {0} AND BattingAverage
    • @user1982973:编辑了我的答案。尝试使用String.Format(CultureInfo.InvariantCulture.NumberFormat ...,因为RowFilter 需要英文小数位格式(点而不是逗号)。
    • 对不起,还是同样的错误信息。我尝试使用 view.RowFilter = String.Format(CultureInfo.InvariantCulture.NumberFormat("BattingAverage... 但现在说:Non-invocable member 'System.Globalization.CultureInfo.NumberFormat'..
    【解决方案2】:

    现在可以通过添加 CultureInfo 来工作。 // 搜索播放器,正在工作 私人无效按钮1_Click(对象发送者,EventArgs e) { view.RowFilter = "LastName like '%" + textBox1.Text + "%'"; if (textBox1.Text == "") view.RowFilter = string.Empty; }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable datatable = new DataTable();
            SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Mattias\Dropbox\C#\Database\Baseball.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
            connection.Open();
            datatable.Load(new SqlCommand("select * from players", connection).ExecuteReader());
            dataGridView1.DataSource = view = datatable.DefaultView;
            connection.Close();
        }
    

    // 现在与 CultureInfo 合作 私人无效按钮2_Click(对象发送者,EventArgs e) { 小数最小值 = Convert.ToDecimal(textBox2.Text); 十进制最大值 = Convert.ToDecimal(textBox3.Text); // 应该显示不同分数的玩家 view.RowFilter = String.Format(CultureInfo.InvariantCulture.NumberFormat,("BattingAverage >= {0} AND BattingAverage

            if (textBox2.Text == "") view.RowFilter = string.Empty;
            if (textBox3.Text == "") view.RowFilter = string.Empty;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2019-12-29
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      相关资源
      最近更新 更多