これはAccessのように簡単だと思いました。
ユーザーは、データテーブルの 1 つの列の値を 1 または 2 に設定する必要があります。
Access-Forms で何度もやったように、「ONE」、「TWO」、および設定 1 または 2 を示すコンボボックスを舞台裏で表示したかったのです。
一方、テーブルが表示される場合、1 または 2 ではなく、ComboBox 内の対応する文字列が表示されます。
この単純なタスクを機能させるにはどうすればよいですか??
これはAccessのように簡単だと思いました。
ユーザーは、データテーブルの 1 つの列の値を 1 または 2 に設定する必要があります。
Access-Forms で何度もやったように、「ONE」、「TWO」、および設定 1 または 2 を示すコンボボックスを舞台裏で表示したかったのです。
一方、テーブルが表示される場合、1 または 2 ではなく、ComboBox 内の対応する文字列が表示されます。
この単純なタスクを機能させるにはどうすればよいですか??
質問にそのようにタグを付けたにもかかわらず、Windowsフォーム用のDataGridViewを意味し、ASP.NET用のGridViewを意味していると思います。
データをDataGridViewComboBoxColumnにどのようにバインドしていますか?DataSourceを設定するときに、DataGridViewComboBoxColumnでDisplayMemberプロパティとValueMemberプロパティを設定する必要があります。DisplayMemberへのMSDNリンクは例を示していますが、両方のプロパティを同じものに設定しているため、要求しているものが完全には示されていません。
DisplayMemberはユーザーに表示するテキストであり、ValueMemberはそれに関連付けられた非表示の基になる値です。
例として、プロジェクトに選択を表すChoiceクラスがあり、次のようになっているとします。
public class Choice
{
public string Name { get; private set; }
public int Value { get; private set; }
public Choice(string name, int value)
{
Name = name;
Value = value;
}
private static readonly List<Choice> possibleChoices = new List<Choice>
{
{ new Choice("One", 1) },
{ new Choice("Two", 2) }
};
public static List<Choice> GetChoices()
{
return possibleChoices;
}
}
GetChoices()は、選択内容を含むリストを返します。理想的には、サービスレイヤーにそのようなメソッドを配置するか、必要に応じて(フォームのコードビハインドで)他の場所に独自のリストを作成できます。簡単にするために、私はそれをすべて同じクラスにまとめました。
フォームでは、次のようにリストをDataGridViewComboBoxColumnにバインドします。
// reference the combobox column
DataGridViewComboBoxColumn cboBoxColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns[0];
cboBoxColumn.DataSource = Choice.GetChoices();
cboBoxColumn.DisplayMember = "Name"; // the Name property in Choice class
cboBoxColumn.ValueMember = "Value"; // ditto for the Value property
コンボボックスに「One」と「Two」が表示されます。そこから選択した値を取得するとき、それは基礎となる1または2の値である必要があります。
これが、DisplayMember/ValueMemberの使用の背後にある考え方です。これにより、作業を開始し、使用していたデータソースを適応させることができます。
これは、コンボボックスの値が変更されたときにグリッドから値を読み取る方法です。
dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 0 && e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
}
}
private void LastColumnComboSelectionChanged(object sender, EventArgs e)
{
var sendingCB = sender as DataGridViewComboBoxEditingControl;
object value = sendingCB.SelectedValue;
if (value != null)
{
int intValue = (int)sendingCB.SelectedValue;
//do something with value
}
}
ソース:この投稿