GridViewsはデータの表示と管理に非常に優れています。あなたは"行に関連付けられた 'ID'値があると述べています。しかし、あなたは実際にIDを取得するためにDB呼び出しを行います。
私にはこれが "DataKey"と叫びます。個人的には、GridViewにデータを挿入するために必要なIDを作成し、そのIDをGridView DataKeyとして追加する方法があります。これはIDをGridViewRowに関連付ける方法です。これは、UpdateSelectedRecords()
の中のSelect DB呼び出しを排除することができます。ただし、ここではあなたのコードがあります。両方のソリューションで修正され、いくつかの点で考慮されています。
protected void UpdateSelectedRecords()
{
////////////////////////////////////////////
// Since these are all local to the function
//
string strPerSignStart = "%";
string strPerSignEnd = "%";
string strDbSearch = strPerSignStart + ddlDatabasesUpdateTCID.Text + strPerSignEnd;
//
//////////////////////////////////////////////
// Consider :
string strDbSearch = String.Format("%{0}%", ddlDatabasesUpdateTCID.Text);
//////////////////////////////////////////////
// FYI These are never used
//
object NewTCID = txtTargetCID.Text;
DateTime curtstmp = DateTime.Now;
//////////////////////////////////////////////
// Instantiate and open a connection once
// also consider using the using() statement
// it make managing connections much easier
//
using(OdbcConnection Postgreconnect2 = new OdbcConnection("Driver= {PostgreSQL Unicode};Server=localhost;Port=5433;Database=postgres;Uid=xxx;Pwd=xxx"));
{
Postgreconnect2.Open();
// Instantiate commands once
OdbcCommand cmd = new OdbcCommand("", Postgreconnect2);
OdbcCommand cmd1 = new OdbcCommand("", Postgreconnect2);
foreach (GridViewRow row in GridView1.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
chkBox = (row.Cells[0].Controls[0] as CheckBox);
//////////////////////////////////
// chkBox.Checked *is* a boolean value, no need to convert to Bool
//
if (chkBox != null && chkBox.Checked)
{
//////////////////////////////////
// Since strDbSearch doesn't change
// just make it part of the select string you are building
// This eliminates the need for parameter passing
//
// Also, check the string you are building
// It doesn't look like it builds a proper SELECT statement
// You're missing a field after "AND"
cmd.CommandText =
"SELECT id FROM conceptidmapping "
"WHERE database ILIKE " + strDbSearch + " AND " +
(chkBox.Checked == true) + " ORDER BY id ASC";
//////////////////////////////////
// No parameters necessary, but...
// This already assigns the value to the parameter
//
//cmd.Parameters.AddWithValue("@database", strDbSearch);
//
// So there is no need to do it again here
//
//cmd.Parameters["@database"].Value = Convert.ToString(strDbSearch);
string idVal = (string)cmd.ExecuteScalar();
///////////////////////////////////
// IF YOU ARE ABLE TO MAKE THE ID A DATAKEY
// Then the entire cmd for the select call above
// can be removed in favor of this:
//
string idVal = Gridview1.DataKeys(row.RowIndex).Values("id")
cmd1.CommandText = "UPDATE conceptidmapping SET selected = true WHERE database ILIKE " + strDBSearch + " AND id = " + idVal ;
cmd1.ExecuteNonQuery();
}
}
}
}
}
コメントと最初にこの上の多くの情報を提供していないためdatakeyで行わ
protected void UpdateSelectedRecords()
{
string strDbSearch = String.Format("%{0}%", ddlDatabasesUpdateTCID.Text);
using(OdbcConnection Postgreconnect2 = new OdbcConnection("Driver= {PostgreSQL Unicode};Server=localhost;Port=5433;Database=postgres;Uid=xxx;Pwd=xxx"));
{
Postgreconnect2.Open();
OdbcCommand cmd1 = new OdbcCommand("", Postgreconnect2);
foreach (GridViewRow row in GridView1.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
chkBox = (row.Cells[0].Controls[0] as CheckBox);
if (chkBox != null && chkBox.Checked)
{
string idVal = Gridview1.DataKeys(row.RowIndex).Values("id");
cmd1.CommandText = String.Format("UPDATE conceptidmapping SET selected = true WHERE database ILIKE {0} AND id = {1}", strDbSearch, idVal) ;
cmd1.ExecuteNonQuery();
}
}
}
}
}
私の謝罪なしで上記と同じコード。起こっているのは、プログラムが 'For'ループに入ったときに、Gridview(上から下)を介して行ごとにナビゲートしているときです。チェックボックスがオンになっていることを確認すると、2番目のIF文(ODBCコマンド付き)が入力されます。最初のODBCコマンドは、その行の 'ID'値の検索を試みます。その 'ID'値を取得すると、2番目のODBCコマンドでその値を使用して、 'selected'列を 'false'から 'true'に更新します。 – M72
何が起こっているのは、正しいデータベースの「ID」値を取得しますが、チェックボックスを選択しなかったことです。誰も私がこのアプローチで持っている簡単な欠陥を見ますか?私はこのプロセスの最初のステップはドロップダウンリストから 'データベース'の値を選択することなので、 'コードビハインド'ファイル(C#)ですべてをやっています。私は間違っているかもしれませんが、マークアップに埋め込まれたコマンドでこのアプローチを使用するのは難しいと思います。どんな提案も大歓迎です!! – M72