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

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

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

Re[3]: 任意のItemをEnable=falseにしたい


(過去ログ 90 を表示中)

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

■53575 / inTopicNo.1)  任意のItemをEnable=falseにしたい
  
□投稿者/ aki (1回)-(2010/09/19(Sun) 17:05:23)

分類:[VB.NET/VB2005 以降] 

こんにちは。

基本的な質問なのですが、、、

ComboBoxに"選択1"、"選択2"、"選択3"というItemsを追加(Add)した場合、
"選択2"だけをユーザーが選べないようにしたいです。

ComboBoxをまったく選択できないようにするには、
Me.ComboBox.Enable=false
とすればよいというのは分かるのですが、

combobox.items.item(1).enable みたいなのがありません。

どなたか分かる方、教えて頂けますでしょうか。
宜しくお願いします。
引用返信 編集キー/
■53576 / inTopicNo.2)  Re[1]: 任意のItemをEnable=falseにしたい
□投稿者/ Azulean (612回)-(2010/09/19(Sun) 17:30:20)
2010/09/19(Sun) 17:31:18 編集(投稿者)

とりあえずリンクだけ。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=27294&rev=&no=0


以前見たときから私の見解として、そんなことはできないと思っています。
(コンボボックスは選択肢を列挙するのですから、選べない候補がいるのは違和感があります)
引用返信 編集キー/
■53580 / inTopicNo.3)  Re[1]: 任意のItemをEnable=falseにしたい
□投稿者/ 魔界の仮面弁士 (1827回)-(2010/09/19(Sun) 19:04:08)
No53575 (aki さん) に返信
> 基本的な質問なのですが、、、
# 基本的かな…? (^^;


> ComboBoxに"選択1"、"選択2"、"選択3"というItemsを追加(Add)した場合、
> "選択2"だけをユーザーが選べないようにしたいです。
たとえば Form に CheckedListBox コントロールを貼っておき、
デザイナ上の [SelectionMode] プロパティから、MultiSimple を
選んでみてください。無効な値として警告メッセージが表示され、
元の値に戻されてしまいますよね。

それと同じで、"選択2" が選ばれたときに警告メッセージを表示して、
元の値に戻してしまうのが、もっとも単純な実装かと思います。


> combobox.items.item(1).enable みたいなのがありません。
もし、"選択2" を使用できないことを分かりやすくするために、
項目を淡色表示したり、あるいはクリックできないようにしたいという
意図なのであれば、単純な方法は用意されていません。

VB/C# に限らず、そういう要望は国内外で良く聞くのですけれどね…。
http://www.fret1.com/blog/silverlight-data-binding-enableddisabled-items-on-combobox/
http://bytes.com/topic/visual-basic-net/answers/825844-disable-items-combobox
http://www.vbforums.com/archive/index.php/t-315349.html
http://bytes.com/topic/net/answers/773264-c-apps-grey-out-disable-some-elements-combo-box
http://www.java2s.com/Code/Java/Swing-Components/DisabledComboBoxExample.htm


それっぽく実装しようとするならば、オーナードローで淡色表示した上で、
選択不可項目が選ばれ時に、記憶しておいた前回の値に戻すといった
大がかりなコードを記述する事になると思います。


なお、無理矢理な方法なので実用的ではありませんが、一応、
WebBrowser で HTML の <option disabled> を使うという力技もあります。
http://javascript.webcreativepark.net/sample/select-option-disabled-emulation/index2.html

# たとえば、IE8 で『http://bbs.wankuma.com/index.cgi?mode=new』のページを開くと、
# 画面下部の「分類」欄に多くの項目が表示されますが、ここで、アドレスバーに
# 『javascript:alert(document.forms[0].sel.options[5].disabled = true)』
# と入力すると、「VB6 以前」の項目が選択できなくなります。
引用返信 編集キー/
■53581 / inTopicNo.4)  Re[2]: 任意のItemをEnable=falseにしたい
□投稿者/ すなふきぬ (44回)-(2010/09/19(Sun) 21:15:40)
2010/09/19(Sun) 23:54:42 編集(投稿者)
2010/09/19(Sun) 21:23:27 編集(投稿者)

<pre><pre>■No53580 (魔界の仮面弁士 さん) に返信
> ■No53575 (aki さん) に返信
>>基本的な質問なのですが、、、
> # 基本的かな…? (^^;

基本的じゃないと思いますが。

>>combobox.items.item(1).enable みたいなのがありません。
> もし、"選択2" を使用できないことを分かりやすくするために、
> 項目を淡色表示したり、あるいはクリックできないようにしたいという
> 意図なのであれば、単純な方法は用意されていません。
>
> それっぽく実装しようとするならば、オーナードローで淡色表示した上で、
> 選択不可項目が選ばれ時に、記憶しておいた前回の値に戻すといった
> 大がかりなコードを記述する事になると思います。

それっぽくWindows Form(C#)で作ってみました。



#comboBox1_DrawItem()のDrawString()、e.Bounds.Yに補正値+1を追加

#なんか知らないけど、荒らしとか言われるのも心外なので、ソース削除しておきます。

</pre></pre>
引用返信 編集キー/
■53765 / inTopicNo.5)  Re[3]: 任意のItemをEnable=falseにしたい
□投稿者/ すなふきぬ (46回)-(2010/09/26(Sun) 22:57:42)
No53581 (すなふきぬ さん) に返信
> 2010/09/19(Sun) 23:54:42 編集(投稿者)
> 2010/09/19(Sun) 21:23:27 編集(投稿者)

> #なんか知らないけど、荒らしとか言われるのも心外なので、ソース削除しておきます。

ちょっと来なかったら荒らしのカキコ削除されてた。
必要ないかもしれませんが、ソースだけ再UP。


public partial class Form1 : Form
{
	DataTable _dt;

	public Form1()
	{
		InitializeComponent();
		_dt = new DataTable();
		_dt.Columns.Add("Value", typeof(int));
		_dt.Columns.Add("Name", typeof(string));
		_dt.Columns.Add("canSelected", typeof(bool));
		for (int i = 0; i < 6; i++)
		{
			DataRow r = _dt.NewRow();
			r[0] = i;
			r[1] = string.Format("項目{0}", i + 1);
			r[2] = ((i % 2) == 1);
			_dt.Rows.Add(r);
		}
		this.comboBox1.ValueMember = "Value";
		this.comboBox1.DisplayMember = "Name";
		this.comboBox1.DataSource = _dt;
		this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
		this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
		this.comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
		this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
	}

	void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
	{
		if (!this.Created) return;
		DataRowView drv = (DataRowView)this.comboBox1.SelectedItem;
		bool isSelected = (bool)drv.Row["canSelected"];
		if (!isSelected) this.comboBox1.DroppedDown = true;
	}

	void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
	{
		if (e.Index < 0) return;

		DataRowView drv = (DataRowView)((ComboBox)sender).Items[e.Index];
		string name = drv.Row["Name"].ToString();
		bool canSelected = (bool)drv.Row["canSelected"];
		bool isHilight = this.isActiveEditItem(e.State) | this.isHoverItem(e.State);

		Brush brFore = (isHilight & canSelected) ? 
			SystemBrushes.ControlLightLight: 
			SystemBrushes.ControlText;
		Brush brBack = !canSelected ? 
			SystemBrushes.ControlLight : 
			(isHilight ? 
				SystemBrushes.Highlight : 
				SystemBrushes.ControlLightLight
			);
		e.Graphics.FillRectangle(brBack, e.Bounds);

		int drawOffsetX = e.Bounds.X + (canSelected ? 10 : 0);
		Font fnt = new Font(((Control)sender).Font, (canSelected ? FontStyle.Regular : FontStyle.Bold));
		e.Graphics.DrawString(name, fnt, brFore, drawOffsetX, e.Bounds.Y + 1);

		if (isHilight & canSelected)
		{
			using (Pen p = new Pen(Color.FromArgb(SystemColors.Highlight.ToArgb() ^ 0x00FFFFFF)))
			{
				p.DashStyle = DashStyle.Dot;
				Rectangle rct = e.Bounds;
				rct.Height--;
				rct.Width--;
				e.Graphics.DrawRectangle(p, rct);
			}
		}
	}

	public bool isActiveEditItem(DrawItemState state)
	{
		return ((state & DrawItemState.Selected) == DrawItemState.Selected) &&
			((state & DrawItemState.Focus) == DrawItemState.Focus) &&
			((state & DrawItemState.ComboBoxEdit) == DrawItemState.ComboBoxEdit);
	}

	public bool isHoverItem(DrawItemState state)
	{
		return ((state & DrawItemState.Selected) == DrawItemState.Selected) &&
			((state & DrawItemState.Focus) == DrawItemState.Focus);
	}
}

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -