【问题标题】:"Input string was not in a correct format."“输入字符串的格式不正确。”
【发布时间】:2013-08-22 06:56:34
【问题描述】:

我正在处理一个项目,在该项目中我有一个表单,我可以通过该表单编辑列表视图中可用的问题。每当我从列表视图中选择一行并单击“修改”按钮时,列表视图上方的文本框都会加载问题及其选项。 这意味着当我在列表视图中选择一行并单击“修改”按钮时,问题会自行加载到文本框中。我在那里编辑问题并单击“保存”以保存更改,但我无法访问文本框中的数据。上面写着{"Input string was not in a correct format."}

我的frmFormWizard'编辑'按钮的代码如下:

frmFormWizard.cs 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Sql;
using System.Data.SqlClient;

namespace SurveyBuilder
{
    public partial class frmFormWizard : Form
    {
        int intPanelNumber = 1;
        Boolean blnCancel = false;
        //int intFlag = 1;

        public frmFormWizard()
        {
            InitializeComponent();
        }

        ...

        private void btnEditTwoOrMoreOptions_Click(object sender, EventArgs e)
        {
            int QuestionID;           
            string sql;

            QuestionID = Convert.ToInt32(lvTwoOrMoreOptions.SelectedItems[0].Text.ToString());
            {
                SqlConnection cn = new SqlConnection();
                SqlCommand rs = new SqlCommand();
                SqlDataReader sdr = null;
                clsConnection clsCon = new clsConnection();

                clsCon.fnc_ConnectToDB(ref cn);

                sql = "";
                sql += "SELECT * FROM SurveyQuestionLog WHERE SurveyQuestionLog.QuestionLogID = "+ QuestionID +"";
                //sql += "SELECT * FROM SurveyQuestionLog";

                rs.Connection = cn;
                rs.CommandText = sql;
                sdr = rs.ExecuteReader();

                while (sdr.Read())
                {
                    txtTwoOrMoreQuestions.Text = (string)sdr["Question"];
                    txtOption1.Text = (string)sdr["Choice1"];
                    ...
                }

                sdr.Close();
                rs = null;
                cn.Close();
            }
        }

每当我尝试编译代码时,它都会显示"{"Input string was not in a correct format."}",并且此错误显示在以下行:

 QuestionID = Convert.ToInt32(lvTwoOrMoreOptions.SelectedItems[0].Text.ToString());

请让我知道我做错了什么。

【问题讨论】:

  • 不要使用字符串连接来生成你的 SQL 语句使用参数,否则你会让它对 SQL 注入开放。
  • lvTwoOrMoreOptions.SelectedItems[0].Text.ToString() 的运行时值是多少?另外,“Text”不应该已经是一个字符串,使 .ToString() 变得多余吗?
  • @Lloyd 说的是真的:xkcd.com/327
  • @Nolonar 这与 C#、字符串连接和参数有什么关系?
  • @Default 与 C# 无关,与 SQL 有关。由于 SQL 语句是字符串,因此您可以通过在需要变量的地方编写有效的 SQL 语句来将命令“注入”到 SQL。当您连接字符串以生成 SQL 语句时,用户可能会滥用此功能,如漫画中所述。这基本上就是 xkcd 的 Lloyd 和 Randall Munroe 试图传达的内容。当然,您可以连接字符串并且仍然可以避免 SQL 注入,但是使用参数而不是连接是最简单的方法。

标签: c# .net winforms visual-studio-2010


【解决方案1】:

文本中似乎包含一些空格。 使用

lvTwoOrMoreOptions.SelectedItems[0].Text.ToString().Trim()

并转换为 int32。

希望这段代码能解决你

来自 cmets

如果您的 ListView 处于报告模式(即它看起来像一个网格),那么您将需要 SubItems 属性。 lvTwoOrMoreOptions.SelectedItems 获取列表视图中的每个项目 - SubItems 获取列。所以lvTwoOrMoreOptions.SelectedItems[0].SubItems[0]是第一列的值,

【讨论】:

  • @Ayesha Noor: lvTwoOrMoreOptions.SelectedItems[0].Text.ToString() 的运行时间值是多少
  • @Ayesha Noor:如果您的 ListView 处于报告模式(即它看起来像一个网格),那么您将需要 SubItems 属性。 lvTwoOrMoreOptions.SelectedItems 为您获取列表视图中的每个项目 - SubItems 为您获取列。所以 lvTwoOrMoreOptions.SelectedItems[0].SubItems[0] 是第一列的值,试试这个。如果您的问题解决了,请将我的答案标记为解决方案
【解决方案2】:

请更改您的代码,如下所示。

  int QuestionID;

  bool IsIntValue = Int32.TryParse("YOUR-VARIABLE", out QuestionID);

  if (IsIntValue)
  {
      // YOUR CODE HERE  
  }

希望我会有所帮助。

【讨论】:

    【解决方案3】:

    每当我尝试编译代码时,它都会显示“{“输入字符串的格式不正确。”}”

    编译时不会出现此错误。

    现在出现错误是因为您试图将无效字符串解析为整数。为了以安全的方式进行操作,您应该这样做

    int questionID;
    if(int.TryParse(vTwoOrMoreOptions.SelectedItems[0].Text.ToString(),out questionID))
    {
    //success code
    }
    else
    {
     //failure code
    }
    

    【讨论】:

      【解决方案4】:

      您可能正试图访问控件内的控件,可能是 GridView 或 DetailsView。

      尝试使用这样的东西:

      empsalary = Convert.ToInt32(((TextBox)DetailsView1.Rows[1].Cells[1].Controls[0]).Text);
      

      【讨论】:

        【解决方案5】:

        看起来该文本包含一些无法转换为整数的字符,如空格、字母、特殊字符等。检查下拉列表中的内容

        lvTwoOrMoreOptions.SelectedItems[0].Text.ToString();

        看看是不是这样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多