【问题标题】:c# show textbox depending on sql valuec# 根据sql值显示文本框
【发布时间】:2017-03-30 09:20:42
【问题描述】:

我有一个带有 2 个表单和一个 DB 的 winform 应用程序,在 form 1 中,用户从几个 pictureboxes 中进行选择后,form2 打开,一些 textboxeslabels 将根据在form1 中进行的选择。 问题是,应用程序无法知道在form1 中选择了哪个项目来处理来自 sql 的信息。 表中有 3 列 id、description 和 prumos。 如何让应用程序识别出我选择了 id x 的图片框,它对应于 x 个“prumos”,以便应用程序可以显示正确的文本框?

感谢您的帮助,我得到的代码已经是:

    cc();
    con.Open();

    SqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "select prumos from dbo.modelos";
    SqlDataReader dr = cmd.ExecuteReader();

    if (dr.Read())
    {
        object value;
        try
        {
            value = dr["prumos"];
        }
        catch (IndexOutOfRangeException) 
        {
            value = null;
        }
        string check = value != null ? value.ToString() : null;
        textBox13.Visible = (check == "2" || check == "3");
        textBox18.Visible = (check == "2" || check == "3");
        textBox17.Visible = (check == "2" || check == "3");
        textBox14.Visible = check == "3";
        textBox16.Visible = check == "3";
        textBox15.Visible = check == "3";
        label16.Visible = (check == "2" || check == "3");
        label20.Visible = check == "3";
    }
    else
    {

    }
    dr.Close();
    con.Close();
    }

非常感谢您的帮助和时间

【问题讨论】:

  • 为什么ifelse if的条件一样?
  • 我必须用它来检查值 2 或 3。如果我删除该行,我会收到错误:当前上下文中不存在名称“检查”但我可能错了: \
  • 如果您使用 Read() 应用程序将无法访问数据库是什么意思?您是否尝试过 while(dr.Read()){}?
  • 我有一些从数据库中以该形式加载的值,但如果我使用 dr.read 这些值将不会加载。如果我删除它们出现但没有文本框规则的行
  • 如果 (dr.HasRows) 失败,你的 else 部分总是会抛出异常,var check = dr["prumos"].ToString();在 else 部分会抛出异常。

标签: c# sql winforms if-statement textbox


【解决方案1】:

改变

var check = dr["prumos"].ToString();

var check = dr[0].ToString();

我认为在您的 DataReader 中不存在“prumos”列,而是一个简单的文本“未找到结果”

试试看

【讨论】:

  • 不幸的是仍然无法正常工作,我无法弄清楚为什么,当我应用此代码时,应用程序停止访问数据库。如果我评论这部分应用程序可以访问数据库
  • 我不明白,如果你写 'dr[0]' 'check' 有什么值?
【解决方案2】:

我只是猜测,因为问题中没有太多信息。 所以你真正想要实现的是: 仅获取某些查询的第一行并更改某些控件的可见性“取决于列的值”

如果是这样的话,那就简单了:

con.Open();

SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select prumos from dbo.modelos";
SqlDataReader dr = cmd.ExecuteReader();

if(dr.Read())
{ 
    // if dr.Read() returns true we already know that dr.HasRows was also true
    object value = null;
    try
    {
        value = dr["prumos"];
    }
    catch(IndexOutOfRangeException) // thrown if there is no such column
    {
    }
    string check = value != null ? value.ToString() : null;
    textBox13.Visible = (check == "2" || check == "3");
    textBox18.Visible = (check == "2" || check == "3");
    textBox17.Visible = (check == "2" || check == "3");
    textBox14.Visible = check == "3";
    textBox16.Visible = check == "3";
    textBox15.Visible = check == "3";
    label16.Visible = (check == "2" || check == "3");
    label20.Visible = check == "3";
}
else 
{
   // what to do if there is no row?
}
dr.Close();
con.Close();

【讨论】:

  • 感谢您的帮助,在string check = value != null : value.ToString() : null; 行我收到错误无法将类型'bool'隐式转换为'string'
  • 好的,现在它接受了代码,但无论我选择什么型号,文本框都不会显示。你的代码有意义,但什么也没发生。
  • 我很抱歉缺少信息,我将尝试解释编辑我的问题。你能看看吗?
  • 你说的是什么意思,问题是,应用程序无法知道在form1中选择了哪个项目来处理来自sql的信息”?您是否要过滤数据库中的数据,以便仅将 id 为“x”的行用于您的“处理代码”?为什么不首先在 SQL 级别使用过滤器?例如:"select prumos from dbo.modelos where id = " + x 无论 x 可能是什么。处理从数据库中没有检索到任何行的情况也是明智的(我在代码中的最后一条评论)。如果您未能检索到任何数据,您不会注意到它,如果您不处理此案。
  • 对不起,我错过了这句话的第一点。你是不是想说,你不知道如何在对象之间传输数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2021-07-01
  • 1970-01-01
  • 2020-12-26
相关资源
最近更新 更多