0

私は単純なグリッドビュー、2 列を持っています。最初の列は数値です。2 番目の列は、ドロップダウン リストから選択した値に基づいています。ドロップダウン リストは機能していますが、テーブルを更新しようとすると、次のエラーが表示されます: インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。パラメータ名:インデックス

問題のある行は55です

Line 53:         {
Line 54:             string BU = (gvSummary.Rows[e.RowIndex].FindControl("dlBU") as DropDownList).SelectedItem.Value;
Line 55:             string AnnoNum = gvSummary.DataKeys[e.RowIndex].Value.ToString();

Webフォームのコードビハインドは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Web.Security;
using System.Configuration;

namespace SHCAnnotation
{
    public partial class WebForm2 : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.BindData();
            }
        }

        protected void EditSummary(object sender, GridViewEditEventArgs e)
        {
            gvSummary.EditIndex = e.NewEditIndex;
            BindData();
        }

        protected void CancelEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gvSummary.EditIndex = -1;
            BindData();
        }

        protected void RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow && gvSummary.EditIndex == e.Row.RowIndex)
            {
                DropDownList dlBU = (DropDownList)e.Row.FindControl("dlBU");
                string query = "select distinct Unit from vw_KmartBU";
                SqlCommand cmd = new SqlCommand(query);
                dlBU.DataSource = GetData(cmd);
                dlBU.DataTextField = "Unit";
                dlBU.DataValueField = "Unit";
                dlBU.DataBind();
                //dlBU.Items.FindByValue((e.Row.FindControl("lblBU") as Label).Text).Selected = true;
            }
        }

        protected void UpdateSummary(object sender, GridViewUpdateEventArgs e)
        {
            string BU = (gvSummary.Rows[e.RowIndex].FindControl("dlBU") as DropDownList).SelectedItem.Value;
            string AnnoNum = gvSummary.DataKeys[e.RowIndex].Value.ToString();
            string strConnString = ConfigurationManager.ConnectionStrings["SRM_MetricConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(strConnString))
            {
                string query = "update vw_GridviewSource set [Business Unit] = @BU where [Annotation Number] = @AnnoNum";
                using (SqlCommand cmd = new SqlCommand(query))
                {
                    cmd.Connection = con;
                    cmd.Parameters.AddWithValue("@BU", BU);
                    cmd.Parameters.AddWithValue("@AnnoNum", AnnoNum); 


                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                    Response.Redirect(Request.Url.AbsoluteUri);
                }
            }
        }




        private void BindData()
        {
            string query = "select [Annotation Number], [Business Unit] as Unit from vw_GridviewSource";
            SqlCommand cmd = new SqlCommand(query);
            gvSummary.DataSource = GetData(cmd);
            gvSummary.DataBind();
        }

        private DataTable GetData(SqlCommand cmd)
        {
            string strConnString = ConfigurationManager.ConnectionStrings["SRM_MetricConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(strConnString))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        return dt;
                    }
                }
            }
        }

    }
}

私がする必要があるのは、最初の列「注釈番号」の値を取得し、更新の where 句で使用することです。したがって、vw_GridviewSource set [Business Unit] = 'Accessories' where [Annotation Number] = '123456' を更新する必要があります

アクセサリはドロップダウン リストから選択され、123456 は編集のためにその行を選択したときにテキスト ボックスに表示されます。

4

1 に答える 1

0

グリッドビューがありませんDataKeyNames。次のようになります。

<asp:GridView ID="gvSummary" 
    runat="server" 
    AutoGenerateColumns="False"
    DataKeyNames="AnnoNum, MyOtherKey1, MyOtherKey2"
    ... ... ...

DataKeyNames プロパティは文字列の配列です。詳細については、MSDNを参照してください。

于 2013-08-29T17:53:27.710 に答える