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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■50812  Re[9]: Excel(SaveAs)がフ゜ロセスに残る
□投稿者/ よねKEN -(2010/06/18(Fri) 15:07:21)
>
    No50809 (VBねっと さん) に返信
    >>oSheetsの解放がありませんので、まずはそれの追加を・・・
    > >
    >
    > 忘れていました。 追加したら解決しました。
    >
    > VB.netではレイトバインドを使うとうまくいくというのが判りました。

    上記の対応も含めてきちんと対応したら、レイトバインドでなくても上手く行ったりしませんか?
    #既に試されていたらごめんなさい。


    ■50811 (VBねっと さん) に返信
    > すみません。 VB.netにもQuitの後に9秒タイマーを入れていました。
    > VBSも9秒にしたら10/10回はOKでした。
    > タイマーでなく、もっと確実に開放する方法にしたいのですが、どなたか
    > 良いアイデアがありませんか?

    VBSやVB.NETで9秒の待ちを入れなくても、単にその程度の時間待ってExcelのプロセスを確認したら終了していませんか?

    Quitするといきなりプロセスが消えるわけでなく、Excelが終了処理をしていると思いますので、
    純粋にExcelの終了にかかる時間だったりしないか?ということです。
記事No.50704 のレス /過去ログ86より / 関連記事表示
削除チェック/

■84124  多階層のxmlのDataTableへの読み書きについて
□投稿者/ なと -(2017/05/17(Wed) 18:28:05)

    分類:[C#] 

    下記のような感じで、親→子→孫のツリー構造のXMLデータを作って、
    親テーブルで名前をダブルクリックしたら子のテーブルが出てきて、
    子テーブルで名前をクリックしたらその子の孫テーブルが出て来る
    ように実装したいと考えております。(テーブルはDataGridViewで表示)

    ネットの海ではDataTableのXML読み書きはDataSet.ReadXml()を使った方法が多いようで、
    このままだと<Grandsons>〜</Grandsons>部分にしか使えませんよね。

    xmlファイルをバラバラにしてしまう方法とXPathかXmlSerializer
    を使ってDataTableへ変換するコードを書く案を考えているのですが
    このような場合に良い方法があればアドバイスを頂けませんか。

    <Parent>
    <Name>親1</Name>
    <Age>70</Age>
    <Childs>
    <Child>
    <Name>子1</Name>
    <Age>35</Age>
    <Grandsons>
    <Grandson><Name>孫1</Name><Age>10</Age></Grandson>
    <Grandson><Name>孫2</Name><Age>8</Age></Grandson>
    </Grandsons>
    </Child>
    <Child>
    <Name>子2</Name>
    <Age>30</Age>
    <Grandsons>
    <Grandson><Name>孫1</Name><Age>5</Age></Grandson>
    <Grandson><Name>孫2</Name><Age>4</Age></Grandson>
    </Grandsons>
    </Child>
    </Childs>
    </Parent>

    以上、よろしくお願い致します。
親記事 /過去ログ143より / 関連記事表示
削除チェック/

■84125  Re[1]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ WebSurfer -(2017/05/17(Wed) 18:54:26)
    No84124 (なと さん) に返信

    DataSet.ReadXml() を使えるように xml ファイルの構造を見直す、それがダメなら XDcoument
    を使う・・・というのは見当違いですか?
記事No.84124 のレス /過去ログ143より / 関連記事表示
削除チェック/

■84126  Re[1]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ 魔界の仮面弁士 -(2017/05/17(Wed) 19:47:18)
    No84124 (なと さん) に返信
    > ネットの海ではDataTableのXML読み書きはDataSet.ReadXml()を使った方法が多いようで、
    > このままだと<Grandsons>〜</Grandsons>部分にしか使えませんよね。

    ReadXml メソッドで、子階層も含めて読み込まれるはずですよ。


    private DataSet ds = new DataSet();
    private DataGrid grid = new DataGrid();
    private void Form1_Load(object sender, EventArgs e)
    {
      ds.ReadXml(@"C:\temp\test.xml");
      grid.Dock = DockStyle.Fill;
      grid.DataSource = ds;
      grid.DataMember = "Parent";
      Controls.Add(grid);
    }


    > (テーブルはDataGridViewで表示)
    リレーションを繋ぐのが面倒だったので、
    上記では DataGrid を使っていますが、
    もちろん DataGridView で実装しても良いと思います。
    DataSet の中身に差がでるわけではないですし。
記事No.84124 のレス /過去ログ143より / 関連記事表示
削除チェック/

■84127  Re[2]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ なと -(2017/05/17(Wed) 20:24:03)
    No84126 (魔界の仮面弁士 さん) に返信
    > ReadXml メソッドで、子階層も含めて読み込まれるはずですよ。
    DataGridViewだとParentしか読まなかったので、気が付きませんでした!

    DataMember = "Grandson";とかに変えれば子とか孫も読み込むんですね。
    しかしながら、子1の孫1,2と、子2の1,2全部読み込まれてしまいました。

    > リレーションを繋ぐのが面倒だったので
    ds.Relations.Addを使えばいいのかな・・・ちょっと調べてみます。
記事No.84124 のレス /過去ログ143より / 関連記事表示
削除チェック/

■84128  Re[3]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ 魔界の仮面弁士 -(2017/05/17(Wed) 20:46:16)
    2017/05/18(Thu) 12:07:08 編集(投稿者)

    No84127 (なと さん) に返信
    > DataGridViewだとParentしか読まなかったので、気が付きませんでした!

    .DataSource = ds;
    .DataMember = tableName;

    の代わりに、

    .DataSource = ds.Tables[tableName];

    でも OK です。これは DataGridView であっても同じことです。


    ただ、階層問い合わせにするのであれば、
    DataSet/DataTable を DataSource に直接バインドするのではなく、
    BindingSource 経由で渡した方が良いかもしれません。


    >>リレーションを繋ぐのが面倒だったので
    > ds.Relations.Addを使えばいいのかな・・・ちょっと調べてみます。

    ReadXml を呼び出した時点で、リレーションは自動的に貼られています。


    『ds.Tables["Parent"].Rows[0].GetChildRows("Parent_Childs")[0]』とすれば
    『ds.Tables["Childs"].Rows[0]』を指し示します。
    これは <Childs> のタグに相当します。(Children ではないのですね)


    『ds.Tables["Childs"].Rows[0].GetChildRows("Childs_Child")[0]』なら、
    『ds.Tables["Child"].Rows[0]』(すなわち 35歳の子1 の行)です。


    もしも DataGridView に表示させるのであれば、
    それぞれの DataGridViewRow から DataBoundItem プロパティ経由で
    DataRowView オブジェクトが得られるので、その Row プロパティから、
    該当の DataRow オブジェクトが得られるようになっています。

    DataRow さえ得られれば、あとは上記と同様に、
    GetChildRows メソッドあるいは GetParentRow/GetParentRows メソッドで
    階層を辿ることができるでしょう。
記事No.84124 のレス /過去ログ143より / 関連記事表示
削除チェック/

■84132  Re[4]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ なと -(2017/05/18(Thu) 21:40:02)
    No84128 (魔界の仮面弁士 さん) に返信
    
    頂いた情報を元に、いろいろ検索して勉強中です・・
    仰る通り複数形はChildrenでしたね(笑)
    
    XMLから読んだDataSetをBindingSourceとDataMemberに割り当てるときのプロパティがよく分からず、
    ウォッチでプロパティ漁っていますが中々当たりません。取り敢えず、BindingSourceは置いといて
    
    Parentはそのまま
    bsp = ds.Tables[tableName];
    dgvp.DataSurce = bsp;
    dgvp.DataMember = "Parent";
    ですよね。
    
    Childは
    ds.Tables["Parent"].Rows[0].GetChildRows("Parent_Children")[0]をそのままDataSurceに入れても関係のない列が出てきてしまったので
    DataTable tblChild = ds.Tables["Parent"].Rows[0].GetChildRows("Parent_Children")[0].GetChildRows("Children_Child")[0].Table;
    dgvc.DataSource = tblChild ;
    としたらそれっぽいのが出ました。
    
    しかし実際には
    DataTable tblGrand = tblChild.Rows[0].GetChildRows("Child_Grandsons")[0].GetChildRows("Grandsons_Grandson")[0].Table;
    dgvg.DataSource = tblGrand ;
    とすると孫1,孫2、孫1、孫2と出て来てしまいました。
    
    なにがダメなんでしょう・・・?
    
    
    検索していたら過去に魔界の仮面弁士さんが書かれているコレが目指している動きと同じような気がします。
    https://social.msdn.microsoft.com/Forums/ja-JP/7440f652-65c3-499c-aacc-4fb6684a6d15/dataviewdatagridviewdatagridview?forum=csharpgeneralja
    とりあえずコレをXML化すれば緒が見つかるかなと・・・頑張ってみます。
    
記事No.84124 のレス /過去ログ143より / 関連記事表示
削除チェック/

■84134  Re[5]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ 魔界の仮面弁士 -(2017/05/18(Thu) 23:54:03)
    No84132 (なと さん) に返信
    > Parentはそのまま
    > bsp = ds.Tables[tableName];
    > dgvp.DataSurce = bsp;
    > dgvp.DataMember = "Parent";
    > ですよね。

    違います。
    それだと『フィールド Parent の子リストを作成できません。』などのエラーとなる可能性があります。

    上記の dgvp というのは、Parent 用の DataGridView を
    指しているのだと思いますが(DataSurce → DataSource というのはさておき)、
    Parent 行を DataGridView に表示するだけなら、
      // DataMember は空のまま
      dataGridView1.DataSource = ds.Tables["Parent"];
    もしくは
      dataGridView1.DataSource = ds;
      dataGridView1.DataMember = "Parent" ;
    です。



    > XMLから読んだDataSetをBindingSourceとDataMemberに割り当てるときのプロパティがよく分からず、

    とりあえずこんな感じ。空のフォームに貼って試してみてください。
    ここでは説明のため、コントロールの配置やイベントの割り当ても、サンプルコード中で行っています。
    (実際の開発には、コントロール等をデザイン時に配置しておくことができます)

    親・子・孫という 3 つの DataGridView を並べてありますが、それぞれは
    BindingSource を通じてリレーションが貼られているため、
    「子1」を選択すれば、長男の子供達(10歳と8歳)が自動的に表示され、
    「子2」を選択すれば、次男の子供達(5歳と4歳)が自動的に表示されます。


    public partial class Form1 : Form
    {
      private DataSet ds = new DataSet("Sample");
      private DataGridView dgvParent, dgvChild, dgvGrandson;

      private void Form1_Load(object sender, EventArgs e)
      {
        Sample();
      }

      private void Sample()
      {
        ds.Clear();
        ds.ReadXml(@"C:\temp\test.xml");

        // 各 DataGridView とのバインドはデザイン時に終わらせてあるので、
        // ReadXml した後で、DataSource を再割り当てする必要はありません。
        //
        // しかしながら、型指定のない「素の DataSet」の場合には、
        // テーブル情報やリレーション情報が無いため、
        // DataMember の割り当ては、ReadXml 後に行う必要があります。
        // (事前に割り当ててしまうと、メンバー名が見つからずエラーになります)
        //
        bndParent.DataMember = "Parent";
        bndChildren.DataMember = "Parent_Childs";
        bndChild.DataMember = "Childs_Child";
        bndGrandsons.DataMember = "Child_Grandsons";
        bndGrandson.DataMember = "Grandsons_Grandson";
        //
        // ただし、DataSet デザイナを用いて「型指定された DataSet」をあらかじめ用意しておき、
        // それをデザイン時に bndParent.DataSource に割り当てていた場合には、
        // 各種 DataMember の割り当てさえもデザイン時に済ませておくことができます。
        //
      }


      public Form1()
      {
        InitializeComponent();

        #region コントロールの配置(実際はフォームデザイナで配置)
        // Load イベントの割り当てです。
        this.Load += Form1_Load;

        // フォームに BindingSource を貼ると、自動的に components がセットされるのですが
        // 今回はデザイン時処理もコードで書いていますので、下記では手動でセットしています。
        if(components == null)
        {
          components = new System.ComponentModel.Container();
        }

        // リレーションごとに BindingSource を用意しておきます。
        bndParent = new BindingSource(components);
        bndChildren = new BindingSource(components);
        bndChild = new BindingSource(components);
        bndGrandsons = new BindingSource(components);
        bndGrandson = new BindingSource(components);

        bndParent.DataSource = ds;
        bndChildren.DataSource = bndParent;
        bndChild.DataSource = bndChildren;
        bndGrandsons.DataSource = bndChild;
        bndGrandson.DataSource = bndGrandsons;

        // 下記では、親・子・孫の DataGridView を縦に3つ並べて配置しています。
        // また、フォームのリサイズに合わせて大きさが変わるよう、
        // それらを TableLayoutPanel の上に配置させています。
        //
        var panel = new TableLayoutPanel() { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 3 };
        dgvParent = new DataGridView() { Dock = DockStyle.Fill, AllowUserToAddRows = false };
        dgvChild = new DataGridView() { Dock = DockStyle.Fill, AllowUserToAddRows = false };
        dgvGrandson = new DataGridView() { Dock = DockStyle.Fill, AllowUserToAddRows = false };
        panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / 3F));
        panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / 3F));
        panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / 3F));
        panel.Controls.Add(dgvParent);
        panel.Controls.Add(dgvChild);
        panel.Controls.Add(dgvGrandson);
        Controls.Add(panel);

        // データバインドの設定を行います。
        // ここでは DataSource のみを設定していますが、元データに型付き DataSet を指定してある場合は、
        // DataMember プロパティも事前に指定しておくことができます。
        //
        dgvParent.DataSource = bndParent;
        dgvChild.DataSource = bndChild;
        dgvGrandson.DataSource = bndGrandson;

        StartPosition = FormStartPosition.WindowsDefaultBounds;
        #endregion
      }
      private BindingSource bndParent;
      private BindingSource bndChildren, bndGrandsons;
      private BindingSource bndChild, bndGrandson;
    }
記事No.84124 のレス /過去ログ143より / 関連記事表示
削除チェック/

■84135  Re[6]: 多階層のxmlのDataTableへの読み書きについて
□投稿者/ なと -(2017/05/19(Fri) 09:44:51)
    No84134 (魔界の仮面弁士 さん) に返信

    コード全体を書いて頂きありがとうございます!

    BindingSourceはそのように使うのですね。
    DataSourceに続けてDataMember書いてはいけないとは・・自力でやっていたら一生解決しなかったかもしれません。

    頂いたコードを改良して、親を多数にした場合や、他のタグも含めた状態で読み書きすることも出来るようになりました。

    また詰まった時はよろしくお願い致します。
記事No.84124 のレス / END /過去ログ143より / 関連記事表示
削除チェック/

■97429  Re[3]: プロセス間通信
□投稿者/ kiku -(2021/05/12(Wed) 16:49:52)
    No97428 (Hongliang さん) に返信
    > その辺を一から実装するのは面倒かつバギーなのであまりお勧めできません。
    > .NET FrameworkであればWCF, .NET Core/5+であればgRPCを使うのはどうでしょうか。
    > どちらもメソッド呼び出しの形でプロセス間通信可能です。サーバプッシュも可能だったはず。
    >
    > その中で、どういう通信方法を使うかというのはまた別の話です。
    > // WCFならnet.pipe(名前付きパイプ)、gRPCならTCPかUnixDomainSocketかな。

    .NETFrameWork4.8を利用しています。
    ぐぐってみたところ、下記の名前付きパイプがヒットしました。
    https://www.chuken-engineer.com/entry/2020/12/25/084124
    なるほど、つかえそうですね。

    1つ質問があります。
    パイプの場合、1対1の通信になりますでしょうか?
    1対1なら、名前付きパイプの名前を変えて、2つパイプを用意することを考えます。
    1対多が可能なら、パイプが1つで実現可能なのかなと。
記事No.97417 のレス /過去ログ169より / 関連記事表示
削除チェック/

■97431  Re[5]: プロセス間通信
□投稿者/ kiku -(2021/05/12(Wed) 17:33:34)
    No97430 (Hongliang さん) に返信
    > もう一度言いますが、通信経路を生で使うのはお勧めしません。
    >
    >>1つ質問があります。
    >>パイプの場合、1対1の通信になりますでしょうか?
    >>1対1なら、名前付きパイプの名前を変えて、2つパイプを用意することを考えます。
    >>1対多が可能なら、パイプが1つで実現可能なのかなと。
    > 1対多は可能です。
    > WCFであればその辺も特に考えずに利用できます。

    Hongliangさんの言っている意味が分かっていないのだと思います。

    こちらでぐぐった下記URLは生で使っているということに該当するのでしょうか?
    https://www.chuken-engineer.com/entry/2020/12/25/084124

    WCFでぐぐってみると、WEBサービス系の情報はでますが
    利用できそうな情報にたどり着けませんでした。
    実装で利用できそうな紹介ページを教えて頂けないでしょうか?
記事No.97417 のレス /過去ログ169より / 関連記事表示
削除チェック/

■99598  Re[3]: 乗数  繰り返し処理
□投稿者/ 魔界の仮面弁士 -(2022/05/01(Sun) 14:07:16)
    No99581 (たか さん) に返信
    > 三つ目の【】以外は【】は整数3桁(マイナスあり)まで
    > 三つ目の【】は少数3桁まで 四捨五入

    何故、たかさんがそれを答えるのですか?
    ここは yama さんが質問されている場ですよ!?

    元質問が書き換えられてしまっていますし、同一人物あるいは関係者なのでしょうけれども。

    http://bbs.wankuma.com/index.cgi?mode=man
    >>>
    >>> □ 利用方法/規約
    >>> ・一貫して同じハンドルを使用し、場を混乱させないようにしましょう。同じハンドルの方が質問の背景がわかりやすいです
    >>>


    少数というのが小数の書き間違いだったとします。また、最初の質問の
    【5】の【3】乗は【125】という投稿は、話を簡単にするために
    【5】の【3】乗は【125】の間違いだったとします。
    (全角入力も許容したいのであれば、数値化の前に半角変換処理を追加してください)


    今回、1つ目、2 つ目に小数が無かったことは僥倖ですね。
    【-2】の【2.5】乗ともなければ、結果は複素数(約 5.65685425 i) になってしまいますから…。


    まず初めに。

    そもそも計算できないケース…たとえば【0】の【0】乗と入力された場合や、
    「整数3桁(マイナスあり)」以外の入力時(たとえば "XYZ" や "" だった場合)に対しては
    計算結果を出すことができないので、計算前に事前判断して、結果を空欄にするなり
    エラーメッセージを出すといった判断処理が必須です。ここまでは良いでしょうか?
    https://ja.wikipedia.org/wiki/0%E3%81%AE0%E4%B9%97


    数値を取り出せたら、次に計算の手順。

    累乗(るいじょう)計算の場合、二つ目の【】は自然数でなければならないため、今回は
    冪乗(べきじょう)計算が求められていることになります。

    通常は、「^ 演算子」を使って算出するのが手っ取り早いです。あるいは Math クラスでも良いですが。
    ここの掲示板の左上にあるリンク(「C# と VB.NET 入門」または「C# と VB.NET のサンプル」)でも紹介されていますね。
    http://jeanne.wankuma.com/tips/vb.net/math/pow.html



    しかし、あえて繰り返し処理で実装してみるとするとどうなるか。
    そもそも【x】の【n】乗は、基本的には「x を n 回掛ける処理」に当たります。
    nが小数の場合は自然対数での変換も必要ですが、今回は整数なので、比較的簡単。


    【n】が自然数な場合(いわゆる累乗)については、For ループなどで算出できます。先ほどの
    >> (1) 累乗演算部を、繰り返しの掛け算処理として実装する。
    がこれに当たります。

    【n】が 0 の場合は、答えが 1 固定です。(x が 0 の場合は除きます)
    これは If 文で答えられますね。

    問題は【n】が 0 未満だった場合ですが、これは逆数にすれば計算できます。

    【n】の【-x】乗

    1÷(【n】の【x】乗)
    に等しいというルールです。


    【5】の【3】乗は【125】
    これは 5 × 5 × 5 = 125 だからですよね。

    【5】の【-3】乗は【0.008】
    これは 125 の逆数すなわち 1 ÷ 125 = 0.008 として求められます。


    それ以外に気にするのはデータの桁数。

    【999】の 【999】乗は【3.680634882592232678947…×(10の2996乗)】
    【999】の【-999】乗は【2.716922574226407515032…×(10の-2997乗)】
    ※この 2 つも逆数になっていますね。

    この場合、絶対値の桁数が大きすぎて VB で扱うのは厳しいです。
    有効桁数が圧倒的に不足します。

    Double.Epsilon(ゼロより大きい最小の Double 値)は、
     4.94065645841247×(10の-324乗)
    の精度しかないため、【10の-2997乗】のような微細な小数は扱えません。

    マイナス乗のケースについては、今回は小数点以下 3 桁まで求めれば十分とのことなので、
    結果の絶対値が 0.001 を下回る場合は 0.000 と表記すればよいことになります。
    0.001 の逆数は 1000 なので、最後の逆数に変換する前に、ループを打ち切ってしまえば良いでしょうね。


    また、Double 型で扱える範囲は
    Double.MinValue (最低値)が -1.7976931348623157×(10の308乗)
    Double.MaxValue (最大値)が +1.7976931348623157×(10の308乗)
    なので、【10の2996乗】のような巨大数も到底扱えません。
    No99580 のコードだと、無限大「∞」として出力されてしまいます。
    ちなみに Long 型だと 10 の18乗相当、Decimal 型だと 10 の 28乗が最大の桁数です。

    そのためループで処理する場合は、桁あふれする前に処理を中断してエラー出力するか、
    あるいは桁あふれのエラーを例外処理して捕まえるか、それとも
    Double 型で無限大値として保持させてしまうか…といった対処も必要ですね。

    誤差なく高精度で計算させることも不可能でもないですが、色々面倒なのでここでは割愛。


    あとは四捨五入。
    Double は二進小数を扱う型なので、四捨五入のような十進小数ベースの処理ですと誤差を含んでしまい、あまり相性が良くありません。
    Decimal 型なら十進小数なので、誤差の影響を受けにくいですが…今回は桁数的にも Double で済ませてしまいましょう。

    四捨五入の方法については、左上のリンクから辿れるリンクで紹介されています。
    https://dobon.net/vb/dotnet/beginner/floatingpointerror.html

    あるいは下記でも良いでしょう。
    https://dobon.net/vb/dotnet/programing/round.html


    最後に、そうして求めた数値を文字列として書式化して表示すれば完成ですね。

    文字列化する際の書式化指定の方法もいろいろありますが、
    まずは String.Format メソッドを使う方法を調べてみてください。
記事No.99571 のレス /過去ログ173より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -