DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridで追加行の禁止について

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 1.1]
分類:[.NET]

【解決したい問題】

VB.NET, WindowsXP

.NET Tipsにあります「DataGridで追加行を禁止する」を利用させて頂こうと思い下記のようにしました。
1. Dim cm As CurrencyManager
2. cm = CType(Me.BindingContext(Grid名.DataSource), CurrencyManager)
3. Dim dv As DataView = CType(cm.List, DataView)
4. dv.AllowNew = False

これをデバッグすると3.行目で下記のメッセージが出て停止します。
「System.InvalidCastException' のハンドルされていない例外が Test.exe で発生しました。
追加情報 : 指定されたキャストは有効ではありません。」

何がどう悪いのでしょうか、VB.NETの経験は、浅いです。
よろしくお願い致します。
■No11447に返信(kokonさんの記事)
> これをデバッグすると3.行目で下記のメッセージが出て停止します。
> 「System.InvalidCastException' のハンドルされていない例外が Test.exe で発生しました。
> 追加情報 : 指定されたキャストは有効ではありません。」

そういうときは、式ウォッチなんかでcm.Listは何が格納されているのか、GetType()して型を見てみたりなど、最低限のデバッグをしてください。
質問はその後でしょ。
■No11448に返信(はいこーんさんの記事)

> そういうときは、式ウォッチなんかでcm.Listは何が格納されているのか、GetType()して型を見てみたりなど、最低限のデバッグをしてください。
> 質問はその後でしょ。

申し訳ないです。
早々のお返事ありがとうございます。
イミディエイトウインドで見ると下記のようになっています。
? cm.List
{System.Data.DataViewManager}
[System.Data.DataViewManager]: {System.Data.DataViewManager}
Item: <cannot view indexed property>
IsReadOnly: True
IsFixedSize: True

意味が十分に理解できないのですが、ReadOnly がTrue になっているのが気になります
実際には10行程上でGrid名.ReadOnly = False を実行しているのですが。
この程度でわかりますでしょうか
不十分で申し訳ありません。
こんにちは。

ぼくも試してみたら、同じエラーがでたのですが、
「ここではDataGrid1.DataSourceに
'DataTableオブジェクトが設定されているものとする」
って文章がありましたよね? それで、DataSourceを変更したところ、うまくいきました。例えば、
DsSample1.T_商品
みたいに記述しました。

> 実際には10行程上でGrid名.ReadOnly = False を実行しているのですが。
> この程度でわかりますでしょうか

僕は初心者で、まちがっていたらごめんなさい。
■No11450に返信(ろんさんの記事)
こんにちは、ありがとうございます。

> 「ここではDataGrid1.DataSourceに
> 'DataTableオブジェクトが設定されているものとする」
はい、この文書は気になっていました。
中断時にイミディエイトウインドでDataSourceを調べてみると下記のように表示されました。
? Grid名.DataSource
{コネクション名.データセット名}
[コネクション名.データセット名]: {コネクション名.データセット名}
なので、設定されていると思ったのですが違うのでしょうか。
ろんさんが設定された実際のコードを具体的に教えて頂けないでしょうか。
私は、ろんさんよりも更に初心者ですね。頭が痛い、むずかしいですm(__)m
> 中断時にイミディエイトウインドでDataSourceを調べてみると下記のように表示されました。
> ? Grid名.DataSource
> {コネクション名.データセット名}
> [コネクション名.データセット名]: {コネクション名.データセット名}
> なので、設定されていると思ったのですが違うのでしょうか。

どうかわからないですけど。

> ろんさんが設定された実際のコードを具体的に教えて頂けないでしょうか。

僕は、dataGrid1のプロパティで、DataSourceを「DataSet1.DataTable」のように設定しました。具体的には、「dsSample1.T_商品」です。プロパティでDataMemberとDataSourceを設定してますよね? その部分のDataSourceだけにまとめてただけです。それか、コードで記述しているのかな?もしコードで記述しているなら、
dataGrid1.DataMember とdataGrid1.DataSource を設定しているところがあると思います。それを,
dataGrid1.Datasource = dsSample1.T_商品
という感じで記述すればいけると思います。今気が付いたのですが、DataMemberに値を設定するとやはりエラーが出るようです。DataMemberに値を設定したらいけないのかな? ちょっとわからないですが。
すいません。全部書きますと。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

daSample.Fill(DsSample1, "T_メイン")
daShophin.Fill(DsSample1, "T_商品")
'ここから下のコードです。######################

'新しい行の追加を禁止する
'CurrencyManagerを取得する
'ここではDataGrid1.DataSourceに
'DataTableオブジェクトが設定されているものとする
  'コードで記述した場合下記一文が必要みたい。
DataGrid1.DataSource = DsSample1.T_商品

Dim cm As CurrencyManager
cm = CType(Me.BindingContext(DataGrid1.DataSource), _
CurrencyManager)
'DataViewを取得する
Dim dv As DataView = CType(cm.List, DataView)
'新しい行の追加を禁止する
dv.AllowNew = False
End Sub
■No11458に返信(ろんさんの記事)

ろんさん、ありがとうございます。

> 僕は、dataGrid1のプロパティで、DataSourceを「DataSet1.DataTable」のように設定しました。具体的には、「dsSample1.T_商品」です。プロパティでDataMemberとDataSourceを設定してますよね?

私もプロパティで設定しています。DataSourceは設定してますが、DataMemberは、空欄です。
同じように設定しているつもりなのですが・・
それで、今、四苦八苦しながらフォームデザイナのツールボックスからDataViewを貼りつけてDataViewを作ってみたところ
dataview名.AllowNew=False が正常に動作しました。
すべてを確認していませんが、動作的にはこれで問題なさそうな気がします。
コードで記述する方法はまだわかりませんが、一応これで進んでみます。
ろんさん、おつきあいありがとうございました、感謝してます。
■No11459に返信(ろんさんの記事)
ろんさん、ありがとうございます。
書き込みが前後したようです。

>   'コードで記述した場合下記一文が必要みたい。
> DataGrid1.DataSource = DsSample1.T_商品

この一行を追加するだけですね、了解しました。
今現在は、動作しているのであまりいじりたくない気持ちです。
次のフォーム作成で確認してみます。(まだフォーム作りがありますので)

ありがとうございました。
ろんさんのご指摘通り
>>  'コードで記述した場合下記一文が必要みたい。
>> DataGrid1.DataSource = DsSample1.T_商品
の一行を追加するとエラーもなくなり追加行を制御できるようになりました。
この行がないとエラーになります、確認しました。
新たなフォームで、ツールボックスからDataViewを貼りつけていない状態で
確認しましたので間違いないと思います。
二日間悩みましたがこれでスッキリしました。
ろんさん、親切なご指導、重ねてお礼申し上げます。
ありがとうございました。
以上

DOBON.NET | プログラミング道 | プログラミング掲示板