C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: NullReferenceException


(過去ログ 112 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■66192 / inTopicNo.1)  NullReferenceException
  
□投稿者/ 名無しさん@C#初心者 (1回)-(2013/04/07(Sun) 22:28:56)

分類:[C#] 

2013/04/07(Sun) 22:29:29 編集(投稿者)
2013/04/07(Sun) 22:29:20 編集(投稿者)

配列でタブページ・ブラウザを作り、タブページにブラウザを貼り付けました。実行してみたらNullReferenceExceptionという例外が発生したので、調べてみたところ、nullとか空白を表すものが選択されると起こるようなので空白の配列を探しましたが、よくわかりませんでした。解決策はありますか?
-----以下コード-----
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Permissions;
using Microsoft.Win32;

namespace WebBrowser
{
    public partial class Form1 : Form
    {
        public System.Windows.Forms.TabPage[] tabPages;
        public System.Windows.Forms.WebBrowser[] webBrowsers;
        public Form1()
        {
            InitializeComponent();                                 //GUiエディタではメニューバーとステータスバーしか貼り付けていません。
            String fn = System.Environment.GetCommandLineArgs()[0];
            String fbe = @"Software/Microsoft/InternetExplorer/Main/wb1/emulation";
            String fdcm = @"SoftWare/Microsoft/InternetExplorer/Main/wb1/mode";
            using (RegistryKey regkey1 = Registry.CurrentUser.CreateSubKey(fbe)) 
            using (RegistryKey regkey2 = Registry.CurrentUser.CreateSubKey(fdcm)) 
            {
                regkey1.SetValue(fn, 8000, RegistryValueKind.DWord);  //UserAgent変更(IE8)
                regkey2.SetValue(fn, 80000, RegistryValueKind.DWord); //レンダリングモード(IE8)
                regkey1.Close();
                regkey2.Close();
            }
            TabControl tabControl1 = new TabControl()
            {
                Dock = DockStyle.Fill,
            };
            this.SuspendLayout();
            this.webBrowsers = new System.Windows.Forms.WebBrowser[5];
            for (int x = 0; x < this.webBrowsers.Length; x++)
            {
                this.webBrowsers[x] = new System.Windows.Forms.WebBrowser();
                this.webBrowsers[x].Name = "webBrowser" + x.ToString();
                this.webBrowsers[x].Url = new Uri("http://google.com");
                this.webBrowsers[x].ScrollBarsEnabled = true;
                this.webBrowsers[x].Dock = DockStyle.Fill;
            }
            this.tabPages = new System.Windows.Forms.TabPage[5];
            for (int i = 0; i < this.tabPages.Length; i++)
            {
                this.tabPages[i] = new System.Windows.Forms.TabPage();
                this.tabPages[i].Name = "TabPage" + i.ToString();
                this.tabPages[i].Text = "タブ" + i;
                this.tabPages[i].AutoScroll = true;
                this.Controls.AddRange(this.webBrowsers);
                tabControl1.Controls.AddRange(tabPages);
            }
            this.Controls.Add(tabControl1);
        }
    }
}

引用返信 編集キー/
■66193 / inTopicNo.2)  Re[1]: NullReferenceException
□投稿者/ Azulean (127回)-(2013/04/07(Sun) 22:59:10)
とりあえず、デバッグしましょう。
デバッグ開始して、止まった行かその前の部分に問題があることが多いわけです。
その止まった行は何をしていますか、その行で使っている変数の中身をカーソルをポイントして見るなどして、何が Null なのか見極めてください。


あとは、2 つ目の for ブロックの末尾 2 行は何かおかしくないでしょうか。
- TabPage ごとに 1 個 WebBrowser を置くべきと考えられるのにそれができていない。(何に追加していますか、きちんと読み直してください)
- tabPages を何回も AddRange する必要はないし、そもそも tabPages[1] 以降に要素を入れられていない状態で AddRange してはいけない。
引用返信 編集キー/
■66194 / inTopicNo.3)  Re[1]: NullReferenceException
□投稿者/ ヴァン (26回)-(2013/04/08(Mon) 10:00:01)
こんにちは。


> this.webBrowsers = new System.Windows.Forms.WebBrowser[5];

> this.tabPages = new System.Windows.Forms.TabPage[5];

5個の配列だけを確保して、実体は作っていない?

引用返信 編集キー/
■66195 / inTopicNo.4)  Re[2]: NullReferenceException
□投稿者/ howling (336回)-(2013/04/08(Mon) 10:40:20)
No66194 (ヴァン さん) に返信

> 5個の配列だけを確保して、実体は作っていない?

これはfor文内でそれぞれに割り当てているので大丈夫では?
少なくともAddRangeを複数回しているのはおかしいですね。
おそらくAzuleanさんの書いているAddRange内の例外になるのかな…。
SuspendLayoutしててResumeしていないとか、Softwareの大文字小文字が違うとか、
まぁ気になるところはいくつかありますけど…例外は出ないかな、きっと。


引用返信 編集キー/
■66197 / inTopicNo.5)  Re[1]: NullReferenceException
□投稿者/ shu (269回)-(2013/04/08(Mon) 12:56:12)
No66192 (名無しさん@C#初心者 さん) に返信
>             this.SuspendLayout();
以下

TabPageとWebBrowserは1:1で対応しているのでfor文を分ける意味はあまりない。

WebBrowserはTabPageに配置されるのであってFormに配置されるのではない。

TabPageはTabControlのTabPagesに配置されるのであってFormに配置されるのではない。

	this.SuspendLayout();
	this.webBrowsers = new System.Windows.Forms.WebBrowser[5];
	this.tabPages = new System.Windows.Forms.TabPage[this.webBrowsers.Length];
	for (int i = 0; i < this.webBrowsers.Length; i++)
	{
		this.webBrowsers[i] = new System.Windows.Forms.WebBrowser();
		this.webBrowsers[i].Name = "webBrowser" + i.ToString();
		this.webBrowsers[i].Url = new Uri("http://google.com");
		this.webBrowsers[i].ScrollBarsEnabled = true;
		this.webBrowsers[i].Dock = DockStyle.Fill;
		this.tabPages[i] = new System.Windows.Forms.TabPage();
		this.tabPages[i].Name = "TabPage" + i.ToString();
		this.tabPages[i].Text = "タブ" + i;
		this.tabPages[i].AutoScroll = true;
		this.tabPages[i].Controls.Add(this.webBrowsers[i]);
	}
	tabControl1.TabPages.AddRange(this.tabPages);
	this.Controls.Add(tabControl1);
	this.ResumeLayout();

引用返信 編集キー/
■66198 / inTopicNo.6)  Re[2]: NullReferenceException
□投稿者/ 名無しさん@C#初心者 (2回)-(2013/04/08(Mon) 14:53:26)
皆様ありがとうございます。例外はおっしゃっていた通り、AddRangeのところで起こっていました。
----以下コード(Forループの部分)----
TabControl tabControl1 = new TabControl()
{
Dock = DockStyle.Fill,
};
this.SuspendLayout();
this.webBrowsers = new System.Windows.Forms.WebBrowser[5];
this.tabPages = new System.Windows.Forms.TabPage[5];
for (int x = 0; x < this.webBrowsers.Length; x++)
{
this.webBrowsers[x] = new System.Windows.Forms.WebBrowser();
this.webBrowsers[x].Name = "webBrowser" + x.ToString();
this.webBrowsers[x].Url = new Uri("http://google.com");
this.webBrowsers[x].ScrollBarsEnabled = true;
this.webBrowsers[x].Dock = DockStyle.Fill;
this.tabPages[x] = new System.Windows.Forms.TabPage();
this.tabPages[x].Name = "TabPage" + x.ToString();
this.tabPages[x].Text = "タブ" + x;
this.tabPages[x].AutoScroll = true;
this.tabPages[x].Dock = DockStyle.Fill;
this.Controls.Add(this.webBrowsers[x]);
}
tabControl1.ResumeLayout();
tabControl1.Controls.AddRange(tabPages);
this.Controls.Add(tabControl1);
}
-------------------------------------------
このよう修正したら、ちゃんと動くようになりましたが、
タブコントロール・タブページのDOCKスタイルをFILLにしているにもかかわらず、タブが左側に偏っています。
また、タブ一覧が表示されず(タブの上の部分)タブを切り替えることができません。
表示させるプロパティなどはありますか?
引用返信 編集キー/
■66199 / inTopicNo.7)  Re[3]: NullReferenceException
□投稿者/ shu (270回)-(2013/04/08(Mon) 15:52:45)
No66198 (名無しさん@C#初心者 さん) に返信
> また、タブ一覧が表示されず(タブの上の部分)タブを切り替えることができません。
> 表示させるプロパティなどはありますか?

this.SuspendLayout();
に対応する
this.ResumeLayout();
が必要です。
引用返信 編集キー/
■66201 / inTopicNo.8)  Re[3]: NullReferenceException
□投稿者/ howling (337回)-(2013/04/08(Mon) 16:02:50)
No66198 (名無しさん@C#初心者 さん) に返信

> タブコントロール・タブページのDOCKスタイルをFILLにしているにもかかわらず、タブが左側に偏っています。

すみません、タブが左側に偏る、というのはどういうことなんでしょうか。
何らかのタブ選択時に、そのタブが開く画面がタブコントロール内全体で表示されるというのがDockだと思っているのですが、
ちょっとどのような形になって欲しいのかがわかりません。
図とかで似たような物があるといいんですけどね。

> また、タブ一覧が表示されず(タブの上の部分)タブを切り替えることができません。

例えば、通常はCtrl+Tabキーでもタブ移動はできますが、それもできませんか?
それができる上で一覧が出ないのだとしたら、

・そもそも一覧を出すように設定していない(デフォルトは出すはずですが)
・出ているけれども、その上にコントロールが乗っている、もしくはバーなんかで隠れている
・タブコントロールの表示位置がおかしい

などが考えられますが、これらをデバッグして追ってみると良いかもしれません。

> 表示させるプロパティなどはありますか?

どのような形にしたいか次第ですね…。
例えばタブのサイズを1つ1つ自由に変えたいとかいうなら、
そもそもタブコントロールを使わずに、パネルとボタンでやった方が早いかもしれないです。
(ちなみに私はこれでよくタブ作ってますが…)
引用返信 編集キー/
■66202 / inTopicNo.9)  Re[4]: NullReferenceException
□投稿者/ howling (338回)-(2013/04/08(Mon) 16:05:45)
No66199 (shu さん) に返信
> this.SuspendLayout();
> に対応する
> this.ResumeLayout();
> が必要です。

あ、よくみるとそうですね…。
タブコントロールのResumeLayoutで解除したつもりになってしまっていたのかな…。
うーん、ただSuspendLayoutしただけでResumeLayoutが無い、と言うと語弊が出てしまうのですね。
もう少し言い回しに気をつけようと思います。説明って難しいですね。
引用返信 編集キー/
■66237 / inTopicNo.10)  Re[3]: NullReferenceException
□投稿者/ shu (275回)-(2013/04/10(Wed) 15:42:51)
No66198 (名無しさん@C#初心者 さん) に返信
> this.Controls.Add(this.webBrowsers[x]);
WebBroserはTabPageの上にあるのでは?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -