9

私はDataGridViewオブジェクトを持っています:

dataGridView1.DataSource = an.peaks;

(an.peaks はList<Point>オブジェクトです。type にはPointx、y、z の 3 つのプロパティがあります)

魔女は実行時に次のテーブルを生成します: (どうやら私Imageは新しいユーザーなので、まだアップロードできないようです。

____|_x__|_y__|_z__|[new column ]
____|_11_|_12_|_13_|[text/button] <==\
____|_20_|_30_|_40_|[text/button] <== } Add text if something or button if something else.
____|_50_|_60_|_70_|[text/button] <==/

いくつかの条件を満たす各行の新しい列に (画像/図面に示されているように) ボタンを追加したいと思います。条件が満たされない場合は、代わりにテキストを追加します。

例: ポイントがデータベースに既に存在する場合、その物質名が表示されます (各ポイントは物質を表します)。そうでない場合は、データベースに新しいポイントを追加するボタン「ADD」を対応する行に追加します。

条件は問題ではありません - それらは単なる例です。問題は、ボタン/テキストを各行に追加し、新しいボタンのクリックイベントを追加することです。

4

2 に答える 2

16

これは、実際には を使用して行うのは非常に簡単DataGridViewです。あなたがする必要があるのは:

タイプ DataGridViewButtonColumn の列を追加します

DataGridViewButtonColumnスタンダードなDataGridViewカラムタイプです。デザイナーを介して追加することもできますが、私は通常、コードを使用することを好みます (通常はフォーム コンストラクターで)。

DataGridViewButtonColumn col = new DataGridViewButtonColumn();
col.UseColumnTextForButtonValue = True;
col.Text = "ADD";
col.Name = "MyButton";
dataGridView1.Columns.Add(col);

UseColumnTextForButtonValuetrue に設定すると、Textプロパティがすべてのボタンに適用され、「ADD」ボタン テキストが与えられます。を使用DataPropertyNameして、グリッドのデータソース内の列をポイントしてボタン テキストを提供することも、各セルの値を直接設定することもできます。

ボタンをテキストに変更

ボタン列を作成したら、特定のボタンをテキストに変換します。これを行うには、ボタン タイプのセルをテキスト タイプのセルに置き換えます。このように多くの場所で実行できますが、最も優れているのはDataBindingCompleteイベント ハンドラーです。このイベントは、グリッドがバインドされて表示の準備が整った後、描画される前に発生します。

以下では、インデックス 1 の行を取得するだけですが、各行のValueプロパティを調べることもできます。

void dataGridView1_DataBindingComplete(object sender,
    DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.Rows[1].Cells["MyButton"] = new DataGridViewTextBoxCell();
}

ボタンのクリックに反応する

問題の最後の部分は、ボタンのクリックへの応答です。これは少しぎこちなく、CellClickイベントまたはEditingControlShowingグリッド全体のイベントを使用する必要があります。

  • セルクリック

    private void DataGridView1_CellClick(object sender,
        System.Windows.FormsDataGridViewCellEventArgs e) 
    { 
        if (DataGridView1.Columns[e.ColumnIndex].Name == "MyButton") 
        { 
            // button clicked - do some logic
        } 
    }
    
  • EditingControlShowing

    void dataGridView1_EditingControlShowing(object sender,
         DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is Button)
        {
            Button btn = e.Control as Button;
            btn.Click -= new EventHandler(btn_Click);
            btn.Click += new EventHandler(btn_Click);
        }
    }
    
    void btn_Click(object sender, EventArgs e)
    {
        int col = this.dataGridView1.CurrentCell.ColumnIndex;
        int row = this.dataGridView1.CurrentCell.RowIndex;
        // Rest of the logic goes here!
    } 
    

あなたの場合、テキストに置き換えられたボタンをクリックしても応答しないため、編集コントロールのアプローチがおそらく最適です。また、この方法は、フォーム上の他のボタンに応答する方法に似ています。

于 2012-05-27T11:43:26.977 に答える
0

WPF ホスト コントロールを WinForms プロジェクトに追加し、 CellTemplateSelectorで DataGrid を使用できます。例えば:

<DataGrid x:Name="grid" AutoGenerateColumns="False" x:FieldModifier="private">
  <DataGrid.Resources>
    <local:PointDataTemplateSelector x:Key="pointDataTemplateSelector" />
    <DataTemplate x:Key="buttonTemplate">
      <Button Click="OnAddButtonClick" Tag="{Binding Mode=OneWay}">Add</Button>
    </DataTemplate>
    <DataTemplate x:Key="textTemplate">
      <TextBlock>Exists</TextBlock>
    </DataTemplate>
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="X" Binding="{Binding X}" />
    <DataGridTextColumn Header="Y" Binding="{Binding Y}" />
    <DataGridTemplateColumn Header="Select" CellTemplateSelector="{StaticResource pointDataTemplateSelector}"></DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

そしてセレクタークラス:

public class PointDataTemplateSelector : DataTemplateSelector {
    public override DataTemplate SelectTemplate(object item, DependencyObject container) {
        var element = container as FrameworkElement;
        if (element != null && item != null && item is Point) {
            var point = (Point)item;

            // Logic here.
            if (point.X >= 5) {
                return element.FindResource("buttonTemplate") as DataTemplate;
            }
            return element.FindResource("textTemplate") as DataTemplate;
        }

        return null;
    }
}

WinForms よりも簡単かもしれません。

于 2012-05-26T23:42:09.740 に答える