csvファイルからコンボボックスへ値を設定する方法 – プログラミング – Home

csvファイルからコンボボックスへ値を...
 
通知
すべてクリア

[解決済] csvファイルからコンボボックスへ値を設定する方法

固定ページ 1 / 2

tikira
 tikira
(@tikira)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

はじめまして。VC++初心者ですが宜しく御願いいたします。
MFCで、csvファイルを読み込み、その読み込んだファイルをコンボボックスにセットし
て表示させるプログラムを作っています。
CSVファイルを一文字づつ読み込んで、コンマで分解された文字列を配列に格納するとこ
ろまでは出来ました。その後、それをどうやってコンボボックスにセットするのかが
分かりません。過去の質問を見ましたが、リストボックスだったので、新規に質問をさ
せてもらいました(^^ゞ

・・・(ファイルオープンするコードの後からです)

while(fp.ReadString(name)){
//一文字ずつ読みコンマ分解
fm = fn = id = 0;
len = name.GetLength();
for (ix = 0; ix < len; ix++)
{
// 先頭から一文字ずつ検索する
if (name[ix] == ',') //コンマを検索
{
// コンマが見つかった場合
fm = ix - 1; // コンマ直前のIndexを取得
if (fn < fm) // 文字列がちゃんと入ってる場合
DataItem[id] = name.Mid(fn, fm-fn+1);
else // 文字列が空の場合
DataItem[id] = ";
fn = ix + 1; // 次の文字列の開始位置を設定
id++; // 配列格納位置をインクリメント
if (id > 2) // 3つ分の分解が終わったら終了
break;
}
}
break;
}
//file close
fp.Close();
OnEditchangeProject(); //ここでコンボボックス処理に飛ぶ??


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

たとえばCSVが
11,12,13,14
21,22,23,24
31,32,33,34
であったとき、コンボボックスにはなにを/どのようにセットしたいのかしら?


返信引用
tikira
 tikira
(@tikira)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

今のCSVファイルは、例えですが

番号,名前,血液型
1,田中,A
2, 佐藤, A
3,小針, B

というファイル構成になっています。
そのCSVファイルの「名前」だけをコンボボックスに
表示して、選択できるようにしたいのです。。
コンマで囲まれている真ん中だけの文字列だけを、コンボボックスにセットする
という考えでいるのですが。。
ご教授よろしくお願いしますm(__)m


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

while ( 一行読める間 ) {
 真ん中の項目を取り出す
コンボボックスに追加
}

こんだけのことです。

コンボボックスにアイテムを追加する方法はご存知ですよね?
# わかんないなら調べてください


返信引用
さやぴ
 さやぴ
(@さやぴ)
ゲスト
結合: 18年前
投稿: 29
 

コンボボックスのアイテム追加は、
AddString関数やInsertString関数で出来ます。


返信引用
tikira
 tikira
(@tikira)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

文字列を追加する、AddStringでやってみました。

CComboBox* pcmb = (CComboBox*)GetDlgItem(IDC_COMBO_BOX);
 pcmb ->AddString(DataItem[id]);


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

…で、解決したのかしら?

# CSV読み込みは実は何の関係も/問題もなくて、
# 単にコンボボックスへのアイテムの追加方法がわかんなかったダケ?


返信引用
tikira
 tikira
(@tikira)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

アドバイスありがとうございます。
まだ全部は解決していませんが、CSV読み込みからのアイテムの設定だったので
文章として全体の流れを書いたので、まどろっこしくなってしまいました^^;
すいませんでした。コンボへのアイテムの追加方法も分からなかったので。
(ただ、実際はCSV読み込みも自信なかったのもあるのですが)

一行づつ読み込んでいて、かつ、一文字づつ読み込み
分解された文字列が配列にはいっているところで

//2番目のアイテムを追加
pcmb ->AddString((LPCTSTR)DataItem[1]);

という処理を、CDialog::OnInitDialog();のところでいれてみましたが
コンボボックスのコントロール自体(OnEditchangeCOMBO())にも、
追加処理を加えないといけないのでしょうか?

質問がわかりにくかったら申し訳ないですm(__)m


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> コンボボックスのコントロール自体(OnEditchangeCOMBO())にも、
> 追加処理を加えないといけないのでしょうか?

OnEditchangeCOMBOってなに?

おそらく、必要ないとおもうけど、実際動かして確認してみたのでしょうか?


返信引用
さやぴ
 さやぴ
(@さやぴ)
ゲスト
結合: 18年前
投稿: 29
 

OnEditchange****は、コンボボックスのアイテム変更がされた後に
呼ばれる関数なので、特に何もする必要ないと思います。

アイテム追加だけで動くはずですが、実際に動かして何か問題が出たのでしょうか?


返信引用
tikira
 tikira
(@tikira)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

コンパイルは通ったのですが、
実行するとコンボに2番目のアイテムが追加されないので
「OnEditchange****」に追加するのかと思ったので。

その後、デバッグしてみると、配列のDataItem[1]のところに
「ンンンンンンンンン」と不明な値が入ってしまっていました。
何が原因なのでしょうか・・・?!


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

えとね、あれこれ欲張らないで、CSVから切り出したとこで
コンボボックスに突っ込むかわりに TRACE か何かで表示させて
確かめりゃええですよ。

何が原因かの前にどこまで正しいかでしょうが。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

というか、いちいち配列に入れる必要あるのであろうか?

επιστημη さんのおっしゃった
> while ( 一行読める間 ) {
>   真ん中の項目を取り出す
> コンボボックスに追加
> }
のタイミングでAddStringすればよいのではないでしょうか?

ちなみに DataItem ってCString型配列?


返信引用
tikira
 tikira
(@tikira)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

>επιστημηさ

デバッグではなく、TRACEをしてみて
値を確認する方法もあるのですね。
なんせ初心者なので、知識が乏しくてお騒がせしております。

>Blueさん

DataItemはCString型です。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

というか、AddStringするタイミングが違うのでは?

CComboBox* pcmb = (CComboBox*)GetDlgItem(IDC_COMBO_BOX);

while( fp.ReadString( name ) )
{
//一文字ずつ読みコンマ分解
fm = fn = id = 0;
len = name.GetLength();
for ( ix = 0; ix < len; ix++ )
{
// 先頭から一文字ずつ検索する
if ( name[ ix ] == ',' ) // コンマを検索
{
// コンマが見つかった場合
fm = ix - 1; // コンマ直前のIndexを取得
if ( fn < fm ) // 文字列がちゃんと入ってる場合
DataItem[ id ] = name.Mid( fn, fm - fn + 1 );
else // 文字列が空の場合
DataItem[ id ] = ";
fn = ix + 1; // 次の文字列の開始位置を設定
id++; // 配列格納位置をインクリメント
if ( id > 2 ) // 3つ分の分解が終わったら終了
break;
}
}
// ★
pcmb->AddString( DataItem[ 1 ] ); // 真ん中のアイテムをリストに追加
}
// file close
fp.Close();


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました