0

GridView各行に[編集]リンクがあります。[編集]をクリックして、のセルにデータを入力し、行をGridView更新するGridViewと、データベース内の対応するテーブルも更新されます。

on_clickがすべての行を列ごとに読み取り、何らかのアクションを実行する保存ボタンがあります。

内のすべてのセルにGridViewデータが入力されている場合、この関数は正常に機能します。のセルGridViewが空の場合、エラーが発生します:入力文字列が正しい形式ではありません。

私が試したコードは次のとおりです。

protected void SAVE_GRID_Click(object sender, EventArgs e)
    {
        foreach (GridViewRow row in GridView2.Rows)
        {
            string Loc = row.Cells[1].Text;

            string strg = "SELECT Location_Type FROM Quantity WHERE Locations='" + Loc + "'";
            SqlCommand com = new SqlCommand(strg, con);
            con.Open();
            SqlDataReader sdr = com.ExecuteReader();
            while (sdr.Read())
            {
                Loctype.Text = sdr[0].ToString().Trim();
            }
            con.Close();

            for (int i = 1; i < GridView2.Columns.Count; i++)
            {
                String header = GridView2.Columns[i].HeaderText;                   

                string str = "SELECT Profile_Type FROM Profile_Tooltip WHERE Profile_Name='"+header+"'";
                SqlCommand cmd = new SqlCommand(str,con);
                con.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    profiletype.Text = dr[0].ToString().Trim();
                }
                con.Close();

                if (!string.IsNullOrEmpty(row.Cells[i + 1].Text.Trim()))
                {
                    int n = Convert.ToInt16(row.Cells[i + 1].Text);
                    //int n = int.Parse(row.Cells[i].Text);

                    for (int m = Asset_List.Items.Count - 1; m >= 0; m--)
                    {
                        Asset_List.Items.Remove(Asset_List.Items[m]);
                    }

                    for (int j = 1; j <= n; j++)
                    {
                        Asset_List.Items.Add(string.Concat(profiletype.Text, j));
                    }

                    for (int k = 0; k <= Asset_List.Items.Count - 1; k++)
                    {
                        com = new SqlCommand("INSERT INTO " + Label3.Text + " VALUES ('" + Loctype.Text + "','" + Loc + "','" + header + "','" + Asset_List.Items[k] + "')", con);
                        con.Open();
                        com.ExecuteNonQuery();
                        con.Close();
                    }
              }
           }
        }
        SqlCommand comd = new SqlCommand("SELECT * FROM " + Label3.Text + "", con);
        SqlDataAdapter da = new SqlDataAdapter(comd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

セルが空かどうかを確認したい。空の場合は、空のセルに対してアクションを実行せずに次のセルにインクリメントしたい。

この問題の解決にご協力ください。ありがとうございました。

4

2 に答える 2

3

トリムとスティング機能を使用するだけです

 if (!string.IsNullOrEmpty(row.Cells[i].Text.Trim() ) ) 

ここをチェックする必要があります

 int n = Convert.ToInt16(row.Cells[i + 1].Text); 

文字列が整数に変換可能であるか、フレームワークの解析または試行解析メソッドを使用していないことを確認してください

short n = 0;
if(Int16.TryParse(row.Cells[i + 1].Text,out n);)
{
  //perform function and user n here now
}
于 2012-09-03T05:47:41.640 に答える
0

私にとって最も目立つ線はこれです:

int n = Convert.ToInt16(row.Cells[i + 1].Text);

私は通常、例外を回避するために次のようなものを使用します。

int n = 0;  
bool didParse = Int16.TryParse(row.Cells[i + 1].Text, out n);
if (didParse)
{
  //add code here
}

セルテキストが空であるか、場合によってはnullであるために、エラーがスローされる例外である可能性があります。

于 2012-09-03T05:55:22.807 に答える