5

ローンのdatagridview分割払いがあります。列を作成したdatagridviewcheckboxので、支払いたいすべての分割払いを選択できます。

これはデータグリッドの画面です。

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

私の問題は、有料のインストールのチェックボックスを無効にする必要があるということです。この場合、「Restante」(支払うべき金額)が= 0

チェックボックスセルを表示しないためにペイントイベントを使用したいくつかの投稿を読みましたが、その解決策が気に入らなかった。チェックボックスのセルを非表示にすることを考えましたが、それが可能かどうかはわかりません。

それが私が試したことです:

foreach (DataGridViewRow row in dgv_Cuotas.Rows)
            {
                if (Convert.ToDecimal(dgv_Cuotas.Rows[row.Index].Cells[17].Value) == 0)
                {
                    dgv_Cuotas.Rows[row.Index].Cells[16].Visible = false;
                }
            }

明らかにこれは機能しません。プロパティが読み取り専用であるというコンパイラエラーメッセージが表示されます。

チェックボックスセルを非表示に設定する方法を誰かが知っていますか?

念のため、DataGridViewCheckboxColumn作成コードを添付します。

DataGridViewCheckBoxColumn chbox = new DataGridViewCheckBoxColumn();
            {
                chbox.CellTemplate = new DataGridViewCheckBoxCell();
                chbox.HeaderText = "";
                chbox.Name = "Seleccionar";
                chbox.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                chbox.FlatStyle = FlatStyle.Standard;
            }
            dgv_Cuotas.Columns.Insert(16, chbox);
            dgv_Cuotas.Columns[16].DisplayIndex = 0;

編集:

いくつかの考慮事項:

セルコンテンツのクリックイベントを使用してチェックボックスを処理しているため、読み取り専用は機能しません。私が欲しいのはチェックボックスを隠すことです:

private void dgv_Cuotas_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex == -1)
            return;
        if (dgv_Cuotas.Columns[e.ColumnIndex].Name == "Seleccionar")
        {
            DataGridViewRow row = dgv_Cuotas.Rows[e.RowIndex];
            DataGridViewCheckBoxCell cellSeleccion = row.Cells["Seleccionar"] as DataGridViewCheckBoxCell;
            int n_cuota = Convert.ToInt32(dgv_Cuotas[2, dgv_Cuotas.CurrentRow.Index].Value);
            Cuota cuota_seleccionada = new Cuota();
            cuota_seleccionada = Lista_cuotas.Where(x => x.num_cuota == n_cuota).First();

            if (cellSeleccion != null && Convert.ToBoolean(cellSeleccion.Value) == true)
            {
                cellSeleccion.Value = false;
                Actualizar_cuotas_seleccionadas(false, cuota_seleccionada);
            }
            else
            {
                if (cellSeleccion != null && Convert.ToBoolean(cellSeleccion.Value) == false)
                {
                    cellSeleccion.Value = true;
                    Actualizar_cuotas_seleccionadas(true, cuota_seleccionada);
                }
            }
        }

一方、私はすでにOnpaintイベントを使用しています。その継承された、それが私がそれを使用することを避けようとしている理由です。

4

8 に答える 8

8

チェックボックスセルに値を割り当てます。次に、それを新しい値のテキストボックスに変換します。私のために働いた。

dataGridView1.Rows[row.Index].Cells[16].Value = false;
dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();
dataGridView1.Rows[row.Index].Cells[16].Value = "";
于 2014-04-16T15:06:50.607 に答える
5

はい、に変換することでこれを行うことができDataGridViewCheckBoxCellますDataGridViewTextBoxCell

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (dataGridView1.Rows[row.Index].Cells[17].EditedFormattedValue.ToString().Length == 0) //  if (string.IsNullOrWhiteSpace(dataGridView1.Rows[row.Index].Cells[4].EditedFormattedValue.ToString()))
                break; 
            if (Convert.ToDecimal(dataGridView1.Rows[row.Index].Cells[17].EditedFormattedValue) == 0)
            {
                dataGridView1.Rows[row.Index].Cells[16].Value = null;
                dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();

            }
            else
            {
                //dgv_Cuotas.Rows[row.Index].Cells[16] = new DataGridViewCheckBoxCell();
            }
        }
于 2013-01-02T14:53:46.880 に答える
4

セルのReadOnly属性を使用して、変更を無効にします。

非表示にしたい場合は、セルのペイントコードを上書きする必要があります。

于 2013-01-02T14:52:09.817 に答える
3

非表示にすると値が残ります。これにより、ランタイムエラーが防止されます。

dataGridView1.Rows[row.Index].Cells[16].Style.Padding =
new Padding(dataGridView1.Rows[row.Index].Cells[16].OwningColumn.Width, 0, 0, 0);
于 2018-12-06T23:02:07.443 に答える
2

私はspajceの答えを受け取り、それが私のために機能するように少し調整しました。

for (var i = 0; i < datagridview1.Count; i++)
{
    if ((bool)datagridview1[0, i])
        {
            datagridview1[0, i] = new DataGridViewTextBoxCell
            {
                        Style = { ForeColor = Color.Transparent, 
                                  SelectionForeColor = Color.Transparent }
            };
        }
}

基本的に行を繰り返し処理し、「true」チェックボックスを探しています。チェックされている場合は、ボックスをテキストボックスに変換し、そのテキストの色を透明に設定して、セルが空に見えるようにします。これがこの問題を抱えているすべての人に役立つことを願っています。私は何時間もかけて実行可能な答えを見つけようとしました。

于 2014-06-10T18:02:32.967 に答える
0

あなたが望むことを達成するためのいくつかの方法があります。

たとえば、セルの読み取り専用プロパティを使用して、ユーザーが値を変更したり、コントロールの外観を灰色に見えるように変更したりしないようにすることができます。

C#DataGridViewCheckBoxColumn非表示/グレーアウト

于 2013-01-02T14:57:23.723 に答える
0

シンプルで効果的な代替手段は、chkboxThreeStateプロパティを使用することです。以下のコードでは、オブジェクトに電子メールアドレスがない場合、ユーザーが電子メールを送信するためのチェックボックスをオンにできないようにします。これを行うには、チェックボックスの値を[不明]および[読み取り専用]に設定します。これは、「選択不可」と表示され、ユーザーが変更できないことを意味します。

chk = DirectCast(row.Cells(m_idxEmailChecked), DataGridViewCheckBoxCell)
If String.IsNullOrEmpty(contact.EmailAddress) Then
  chk.Value = enumTristate.Unknown
  chk.ReadOnly = True
Else
  chk.ThreeState = False
End If

これには、いくつかの関連するThreeStateプロパティをチェックボックスに設定する必要があることに注意してください。

        .ValueType = GetType(enumTristate)
        .TrueValue = enumTristate.True
        .FalseValue = enumTristate.False
        .IndeterminateValue = enumTristate.Unknown
        .ThreeState = True

幸運を。

于 2016-10-04T08:56:52.960 に答える
-1

私はチャーリーの方法を試しました:

dataGridView1.Rows[row.Index].Cells[16].Value = false;
dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();
dataGridView1.Rows[row.Index].Cells[16].Value = "";

エラーは少なくなりましたが、それでもエラーは発生し続けました。そこで、新しいDataGridViewTextBoxCellを個別にインスタンス化しようとしましたが、それでうまくいきました(チェックボックスのセル値も設定する必要はありませんでした)。

DataGridViewTextBoxCell c = new DataGridViewTextBoxCell();
c.Value = "";
dataGridView1.Rows[row.Index].Cells[16] = c;

それが誰かを助けることを願っています!

于 2016-01-25T16:30:29.200 に答える