2

私のdatagridview場合、4つの列1と2は読み取り専用で、列3と4は数値を取得しました。4番目の列は3番目の列より大きくなければならないことを比較したいと思います。例えば:

ここに画像の説明を入力してください

4番目の列の値が3番目の列よりも小さい場合、メッセージが別のコントロールに移動しないことを提案したいと思います。

私の単純なアプローチはうまくいかないようです。この種の条件について、2つの特定の列を比較するにはどうすればよいですか?

private void datagridview_CellValidating(object sender, CellValidatingEventArgs e)
{
    try
    {
        int bbor = datagridview.CurrentCell.ColumnIndex;
        int ebor = datagridview.CurrentCell.RowIndex;
        if (ebor <= bbor)
        {
            MessageBox.Show("Please verify the value");
            e.Cancel = true;
        }
    }
    catch (Exception exception)
    {
    }
}
4

4 に答える 4

1

私は多かれ少なかれそのようなものを見るでしょう:

すべての行をチェックする場合:

DataRow dr;
for(int i = datagridview.Rows.Count-1; i > 0; i--) {
    dr = datagridview.Rows[i];
    if(dr[e.ColumnIndex] > dr[e.ColumnIndex+1]){
            //your message code     
            e.Cancel = true;
        break; (or return;)
    }
}

セルが編集されている現在の行のみを確認する場合:

DataRow dr = datagridview.Rows[e.RowIndex];
e.Cancel = dr[e.ColumnIndex] > dr[e.ColumnIndex+1];
if(e.Cancel)
    //your message code

比較のために、オブジェクトをintに変換する必要があるかもしれません。

于 2012-11-06T20:52:39.463 に答える
1

DataGridViewのRowsプロパティを参照してくださいhttp://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rows.aspx

this.dataGridView1 [col、row] .Value

各行の特定のセルを参照します

foreach (Row r in this.dataGridView1.Rows) {
    if (r.Cells[3].Value <= r.Cells[2].Value ) {
    System.Console.WriteLine ("error");
    }
}
于 2012-11-06T21:01:54.977 に答える
1

検証チェックでは、FormattedValueプロパティを使用して、ユーザーが編集したセルに挿入する値を確認する必要があります。CellValidating現在のセル値は、trueに設定せずに完了するまで新しい値に更新されないため、使用できませんDataGridViewCellValidatingEventArgs.Cancel

このようなもの:

private void datagridview_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
    // This is the new proposed value the user entered; could be for column 3 or 4.
    int newValue = int.Parse(e.FormattedValue.ToString());

    // See which column fired the CellValidating event and use the new proposed value for it
    // in place of the cell's actual value for purposes of our validation.
    int col3Value = (e.ColumnIndex == 2) ? newValue : (int)dataGridView1[2, e.RowIndex].Value;
    int col4Value = (e.ColumnIndex == 3) ? newValue : (int)dataGridView1[3, e.RowIndex].Value;

    if (col3Value <= col4Value) {
        MessageBox.Show("Please verify the value");
        e.Cancel = true;
    }
}

ここに示すコードは、問題の解決策を示すためのものです。実際の本番コードでは、オブジェクトからintへのキャストが(からint.TryParse)成功した​​ことを確認するか、この操作が失敗したときに発生する例外をキャッチする必要があります。これが発生するCancel = trueと、セルを検証して、ユーザーに数値を入力する必要があるというメッセージを表示できます。

また、もう1つの簡単な注意:空のcatchブロックは使用しないでください(ただし、これはおそらく本番コードには含まれていないと思います)。

于 2012-11-06T21:38:56.827 に答える
1

また会えた。cell_clickイベントを使用します。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex != 0)
    {
        if (Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()) <= Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value.ToString()))
        {
            MessageBox.Show("Please verify the value");
        }
    }
}

編集1:これはうまくいくようです、lemmeは知っています。

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    if (e.ColumnIndex != 0)
    {
        if (Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()) <= Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value.ToString()))
        {
            MessageBox.Show("Please verify the value");
            e.Cancel = true;
        }
    }
}

編集2:Telerikコントロール用に更新

private void radGridView1_CellValidating(object sender, Telerik.WinControls.UI.CellValidatingEventArgs e)
    {
        if (e.ColumnIndex != 0)
        {
            if (e.Value != null && radGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value != null)
            {
                if (Double.Parse(e.Value.ToString()) <= Double.Parse(radGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value.ToString()))
                {
                    MessageBox.Show("error");
                    e.Cancel = true;                        
                }
            }
        }
    }

ここに画像の説明を入力してください

于 2012-11-06T21:51:14.880 に答える