2

クライアントのリストとその詳細がSq1DataSourceにバインドされたGridViewがあります。セルごとにデータにアクセスし、クライアントBLLのUpdate関数に送信することで、RowUpdatingイベントを介してコードビハインドから更新したいと思います。これはコードです:

   protected void gvClients_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        GridViewRow row = gvClients.Rows[e.RowIndex];
        //accesses Client Id
        cliIdStr = ((TextBox)(row.Cells[1].Controls[0])).Text;
        int cliId = int.Parse(cliIdStr);
        cliBll = new ClientBLL(conStrName);
        //Accesses client object from DB according to Client Id accessed from gridView
        client = cliBll.GetClient(cliId);
        if (client != null)
        {
            client.ClientName = ((TextBox)(row.Cells[2].Controls[0])).Text;
            client.Phone = ((TextBox)(row.Cells[3].Controls[0])).Text;
            client.EMail = ((TextBox)(row.Cells[4].Controls[0])).Text;
            client.Fax = ((TextBox)(row.Cells[5].Controls[0])).Text;
            client.Address = ((TextBox)(row.Cells[6].Controls[0])).Text;
            client.City = ((DropDownList)(row.Cells[7].Controls[0])).SelectedValue;
            client.ZipCode = ((TextBox)(row.Cells[8].Controls[0])).Text;
            client.IdNum = ((TextBox)(row.Cells[9].Controls[0])).Text;
            client.BusField = ((TextBox)(row.Cells[10].Controls[0])).Text;
            cliBll = new ClientBLL(conStrName);
            cliBll.UpdateClient(cliDtlShrt);
        }
    }

プログラムを実行してGridViewの編集ボタンを押すと、すべて問題ありませんが、Uodateボタンを押すと、次の例外がスローされます。

[ArgumentOutOfRangeException:指定された引数が有効な値の範囲外でした。パラメータ名:インデックス]
System.Web.UI.ControlCollection.get_Item(Int32インデックス)+8673806

コード内のこの行を指す:

cliIdStr = ((TextBox)(row.Cells[1].Controls[0])).Text;

メッセージを正しく理解している場合、問題はControls [0]にありますが、なぜですか?更新に送信するためにgridViewセルからデータにアクセスするにはどうすればよいですか?

4

1 に答える 1

1

更新が発生すると、編集UIを提供する行が使用できなくなるため、コードは失敗します。の行e.RowIndexは通常のグリッドビュー行であり、そのセルは列タイプごとに制御されます。したがって、ほとんどのセル(BoundField列のセルなど)は、セルに値が直接含まれているため、その内部にコントロールがありません。したがって、でのエラーが発生しControls[0]ます。

行(非キー列)の新しい値を取得するには、GridViewUpdateEventArgs.NewValuesプロパティを使用する必要があります。同様に、キー列の値はe.Keysに表示されます。

編集:私はまたあなたがあなたの人生をより簡単にするObjectDataSource代わりに使うことを検討することを提案します-あなたが始めるためにこの記事を見てください。SqlDataSource

于 2011-08-29T12:32:55.690 に答える