4

データベースからのデータを含む GridView があります。

ただし、削除リンクにカーソルを合わせると、間違った ID にリンクされます。

データベースのIDを使用したい。

この質問はこれと非常に関連してますが、回答はありませんでした。

私のGridViewコードは次のようになります。

<asp:GridView ID="GridView1" runat="server" OnRowDeleting="GridView1_RowDeleting1" AutoGenerateColumns="false" DataKeyNames="id">
    <Columns>
      <asp:BoundField HeaderText="Name" DataField="name" />
      <asp:BoundField HeaderText="Email" DataField="email" />
      <asp:BoundField HeaderText="Comment" DataField="comment" />
      <asp:CommandField ShowDeleteButton="True"  />
    </Columns>
</asp:GridView>

DeleteButton正しい ID へのリンクを作成するにはどうすればよいですか?

アップデート

データをデータテーブルに配置するページ読み込みコード:

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable commentsTable = null;
        commentsTable = new DataTable("Comments");
        using (SqlDataReader reader = studentManager.getCommentsFromDB())
        {
            commentsTable.Load(reader);
            GridView1.DataSource = commentsTable;
            GridView1.DataBind();
        }
    }

getCommentsFromDB:

    public SqlDataReader getCommentsFromDB()
    {
        SqlConnection conn = dal.connectDatabase();
        conn.Open();
        cmd = new SqlCommand(@"SELECT id, name, email, comment FROM GuestBook", conn);
        rdr = cmd.ExecuteReader();
        return rdr;
    }
4

2 に答える 2

3

これを行う方法はいくつかあります。CommandName私は ASP.NET ボタンを使用し、プロパティを に設定する傾向があります"Delete"

<asp:Button ID="btnDelete" runat="server" CommandName="Delete" />

また

<asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/Images/Delete.gif" CommandName="Delete" />

また

<asp:CommandField ButtonType="Button" DeleteText="Delete" ShowDeleteButton="true" />

あとは、 を処理するイベントを配線するだけOnRowDeletingです。

protected void GridView1_RowDeleting1(object sender, GridViewDeleteEventArgs e) {
    // Get the id
    string id = GridView1.DataKeys[e.RowIndex].Value.ToString();

    // Create the delete query
    string sql = @"delete from GuestBook where id = @id";

    using (SqlConnection conn = dal.connectDatabase()) {

        cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@id", SqlDbType.Int);
        cmd.Parameters["@id"].Value = id;

        try {
            conn.Open();
            cmd.ExecuteScalar();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }

    // Refresh the GridView1
    Bind_GridView1();
}

...そして、更新するたびに呼び出すメソッドGridView。ページのどこからでも呼び出すことができる独自のメソッドでバインド呼び出しを行う方がはるかにクリーンGridViewです (つまり、ページ読み込みイベントからも呼び出すことができます)。

public void Bind_GridView1() {
        DataTable commentsTable = null;
        commentsTable = new DataTable("Comments");
        using (SqlDataReader reader = studentManager.getCommentsFromDB())
        {
            commentsTable.Load(reader);
            GridView1.DataSource = commentsTable;
            GridView1.DataBind();
        }
}
于 2012-10-25T20:21:35.623 に答える
0

追加してみてください<asp:BoundField DataField="id" ReadOnly="True" Visible="false" />

DataTableまた、使用しているものを明示的に定義する必要がある場合もあります。DataSource

データテーブルの定義

        DataTable dt = new DataTable();
        DataColumn col = new DataColumn()
        {
            ColumnName = "id"
        };
        dt.Columns.Add(col);
        col = new DataColumn()
        {
            ColumnName = "name"
        };
        dt.Columns.Add(col);

そして、必要な列ごとに続行します

于 2012-10-25T20:12:39.397 に答える