|
■No90239 (c さん) に返信 > // 表示項目と値のセット > listBox1.DisplayMember = "教科";
これだと、「誰の」教科かわからないような…。
■No90240 (魔界の仮面弁士) に追記 > 並び替え用のフィールドを追加して、 > そこに「並べたい順番」に番号を振っていくのが簡単です。
サンプル。
private void Form1_Load(object sender, EventArgs e) { DataSet dataSet = new DataSet(); DataTable table = dataSet.Tables.Add("Table");
table.Columns.Add("教科"); table.Columns.Add("点数", typeof(int)); table.Columns.Add("氏名"); table.Columns.Add("クラス名");
table.Rows.Add("数学", 80, "田中 一郎", "A"); table.Rows.Add("英語", 70, "田中 一郎", "A"); table.Rows.Add("国語", 60, "鈴木 二郎", "A"); table.Rows.Add("数学", 50, "鈴木 二郎", "A"); table.Rows.Add("英語", 80, "鈴木 二郎", "A"); table.Rows.Add("国語", 70, "佐藤 三郎", "B"); table.Rows.Add("数学", 80, "佐藤 三郎", "B"); table.Rows.Add("英語", 90, "佐藤 三郎", "B"); dataSet.AcceptChanges();
dataSet.EnforceConstraints = false;
// ソート用に、0 から始まる連番を付与 table.Columns.Add("SortNo", typeof(int)).AllowDBNull = false; for (int rowIndex = 0; rowIndex < table.Rows.Count; rowIndex++) { table.Rows[rowIndex].SetField<int>("SortNo", rowIndex); }
// 画面表示用の式列を追加する。 table.Columns.Add("DisplayName", typeof(string), "`教科`+' ('+`クラス名`+'組:'+`氏名`+')'");
dataSet.EnforceConstraints = true; table.AcceptChanges();
this.listBox1.SelectionMode = SelectionMode.One; this.listBox1.DisplayMember = "DisplayName"; this.listBox1.ValueMember = null; this.listBox1.DataSource = new DataView(table, "", "SortNo ASC", DataViewRowState.CurrentRows);
this.button1.Text = "1 Up"; this.button2.Text = "3 Up"; this.button3.Text = "3 Down"; this.button4.Text = "1 Down"; this.button1.Tag = -1; this.button2.Tag = -3; this.button3.Tag = 3; this.button4.Tag = 1;
this.button1.Click += this.UpDownButtons_Click; this.button2.Click += this.UpDownButtons_Click; this.button3.Click += this.UpDownButtons_Click; this.button4.Click += this.UpDownButtons_Click; }
void UpDownButtons_Click(object sender, EventArgs e) { var offset = ((Control)sender).Tag as int? ?? 0; var rowView = this.listBox1.SelectedItem as DataRowView; if (offset == 0 || rowView == null) { return; }
var row = rowView.Row; var rows = row.Table.Rows;
// 新旧の SortNo を求める int minSortNo = 0; int maxSortNo = rows.Count - 1; int oldSortNo = row.Field<int>("SortNo"); int newSortNo = Math.Min(Math.Max(oldSortNo + offset, minSortNo), maxSortNo);
// DataTable.Select メソッドに渡す 抽出条件。LINQ で抽出しても良い。 string filter = string.Format("`SortNo` <> {0} AND `SortNo` >= {1} AND `SortNo` <= {2}", oldSortNo, Math.Min(oldSortNo, newSortNo), Math.Max(oldSortNo, newSortNo));
var table = row.Table; var ds = table.DataSet; ds.EnforceConstraints = false; DataRow[] movingRows = table.Select(filter, ""); // 加工前に配列に入れておく
// SoftNo の差し替え int d = -Math.Sign(offset); Array.ForEach(movingRows, r => r.SetField<int>("SortNo", d + r.Field<int>("SortNo"))); row["SortNo"] = newSortNo;
ds.EnforceConstraints = true; }
|