あなたが探している情報は、この日記には記されていない可能性が高いです。(検索で来た人用)
にらどんは一杯500円。尚、出前は承っておりません。ご了承下さい。

あった。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1776237&SiteID=7
下から二番目。
キャストして呼び出すって書いてある。>青柳氏の発言。
この記述だとIntにキャストしてるだけで、SelectedItemsに格納されたオブジェクトのメンバであるKeyは取り出せないと思うんだけど。
まぁC#だし文の意味も理解してないから多分あれはあれであってるんだろう。
C++でやるなら昨日書いたStringで取り出すか、もしくはキャストしかないってことだ。
まとめの解説コード書いてくるよ。


ぶはwwwwwwwwwこれはwwwwwwwwww
今までコード勘違いしてたwwwwwwwwwばろすwwwwwwwww
ToStringやっぱりいらねえwwwwwwwwっうぇwwっうぇwwwww
おkwwwwwwwww把握したwwwwww


以下これでもかとコメントを詰め込んだVC++版ListControl.DataSourceの解説コード。
MSDNの使用例を元にしています。ちなみにコピペでコンパイル可。

#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Collections;

// アイテムリストに追加するオブジェクトUSState
// プロパティの型はなんでもおk
public ref class USState
{
private:
   String^ myName;
   int myNum;

public:
   USState( String^ inputName, int inputValue )
   {
      this->myName = inputName;
	  this->myNum = inputValue;
   }

   property int Number 
   {
      int get()
      {
         return myNum;
      }
   }

   property String^ Name 
   {
      String^ get()
      {
         return myName;
      }

   }
   virtual String^ ToString() override
   {
	   return String::Concat( this->Number.ToString(), " - ", this->Name );
   }
};

public ref class ListBoxSample3: public Form
{
	// 窓作成 ここから
private:
   ListBox^ ListBox1;
   TextBox^ textBox1;

public:
   ListBoxSample3()
   {
      ListBox1 = gcnew ListBox;
      textBox1 = gcnew TextBox;
      this->ClientSize = System::Drawing::Size( 292, 181 );
      this->Text = "ListBox Sample3";
      ListBox1->Location = Point(24,16);
      ListBox1->Name = "ListBox1";
      ListBox1->Size = System::Drawing::Size( 232, 130 );
      textBox1->Location = Point(24,160);
      textBox1->Name = "textBox1";
      textBox1->Size = System::Drawing::Size( 240, 24 );
      array<Control^>^temp2 = {ListBox1,textBox1};
      this->Controls->AddRange( temp2 );
	// ここまで 今回は関係ありません
      
      // ArrayList^ USStatesを宣言し、IListインターフェイスを実装するUSStateの配列を作ります
      ArrayList^ USStates = gcnew ArrayList;
      USStates->Add( gcnew USState( "太郎", 11 ) );
      USStates->Add( gcnew USState( "二郎", 22 ) );
      USStates->Add( gcnew USState( "三郎", 33 ) );

	  // SelectedValueが変更されたらイベントを発生させます
      ListBox1->SelectedValueChanged += gcnew EventHandler( this, &ListBoxSample3::ListBox1_SelectedValueChanged );

	  // 重要
	  // ListBox1->DataSourceに先ほどの配列を設定します
	  ListBox1->DataSource = USStates;
	  // DisplayMember, ValueMemberのそれぞれに、
	  // 配列に格納されているオブジェクトのプロパティ名を String^型 で代入します
	  // これで設定完了です
      ListBox1->DisplayMember = "Name";
      ListBox1->ValueMember = "Number";
   }

   void InitializeComponent(){}

private:

   void ListBox1_SelectedValueChanged( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
	 // 動作確認用の無意味な記述です。ブレークポイントを置くなどして動きを確かめてみてください
	   int i = 0;
	   // ValueMemberが設定されているかどうかは、空文字列と比較することで確認できます(デフォルトが空文字なので
	   if (ListBox1->ValueMember != "")
		   // SelectedValueはObject^型を返すので、設定したValueMemberの型に応じてキャストしてやります
		   i = Convert::ToInt32(ListBox1->SelectedValue);
	 // 無意味ここまで
	   
	   if ( ListBox1->SelectedIndex != -1 )
		   // USState->ToStringが呼び出されるのはValueMemberが設定される前までです
		   // 設定された後はValueMemberで設定されたプロパティのToString()を返します
		   // コンパイル時にキャストが要らなくなるのでString^型を返す場合はこっちのがいいかも
		   textBox1->Text = ListBox1->SelectedValue->ToString;
   }
};

[STAThread]
int main()
{
   Application::Run( gcnew ListBoxSample3 );
}