1

DataGridViewフォームを管理できます。6つの列と6つの行があります(変更されることはありません)。ユーザーが任意の列の下のセルにデータを入力するとき、その行の残りのセルにユーザーが入力していることを確認したいと思います。したがって、基本的に、データを行0 –列0に配置する場合、行0 –列1、行0 –列2などにデータが含まれていることを確認したいと思います。これがデータベースにコミットされる前に、検証の理由でこれが必要です。その行のフィールドがすべて入力されていない場合は、修正が必要な行を含むメッセージを表示したいと思います。

どんな助けでも大歓迎です!

これが更新です、私は何をする必要があるかを理解しました。

Private Sub ValidateYear()

    Dim oInvYear As New Collection
    Dim oErrorMsg As New System.Text.StringBuilder
    Dim blnErrFound As Boolean = False

    'Loop through year column and check for number, if blank skip'
    For i As Integer = 0 To dgvIntervals.Rows.Count - 1
        If Not String.IsNullOrEmpty(dgvIntervals.Rows(i).Cells(4).Value) Then
            If Not IsNumeric(dgvIntervals.Rows(i).Cells(4).Value) Then
                oInvYear.Add(i + 1)
                blnErrFound = True
            End If
        End If
    Next

    'If errors found, lets append them to our message'
    If blnErrFound Then
        oErrorMsg.Append("PLEASE FIX ERRORS BELOW BEFORE PROCEEDING")
        oErrorMsg.AppendLine("")
        oErrorMsg.Append(vbCrLf)

    'Get our year count errors'
    If oInvYear.Count > 0 Then
        oErrorMsg.Append("* Year must be a number- ")
        oErrorMsg.Append("Line(s): ")
        For i As Integer = 1 To oInvYear.Count
            If i >= 2 Then
                oErrorMsg.Append(", ")
            End If
            oErrorMsg.Append(oInvYear.Item(i).ToString)
        Next
        oErrorMsg.Append(vbCrLf)
    End If

    'Show them to our user'
    MsgBox(oErrorMsg.ToString)

End Sub 
4

2 に答える 2

0

このシナリオでは、所有しているすべての行からすべてのセルを読み取ることをお勧めします。セルに値が見つかったら、他のセルの値があることを確認する必要があります。

私はあなたのために少しサンプルをしました、私はこれがあなたの問題であなたを助けることを願っています。

最初に、グリッドビューを埋めるためにこのエンティティを作成しました。

  public class MyEntity
    {
        public string ID { get; set; }

        public string Name { get; set; }

        public string LastName { get; set; }
    }

これは私のaspxページのコードです

<form id="form1" runat="server">
    <div>
        <asp:GridView ID="grvData" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField HeaderText="ID" >
                    <ItemTemplate >
                        <asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField  HeaderText="Name">
                    <ItemTemplate>
                        <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("Name") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField  HeaderText="Last Name">
                    <ItemTemplate>
                        <asp:TextBox ID="txtLastName" runat="server" Text='<%# Eval("LastName") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <br />
        <asp:Button ID="btnValidate" runat="server" Text="Validate" OnClick="btnValidate_Click" />
        <br />
        <asp:Label ID="lblMessage" runat="server" ForeColor="Red" Text="">

        </asp:Label>
    </div>
    </form>

それから私のコードの後ろに

public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                List<MyEntity> data = GenerateData();
                this.grvData.DataSource = data;
                this.grvData.DataBind();
            }
        }

        protected void btnValidate_Click(object sender, EventArgs e)
        {
            int columns = this.grvData.Columns.Count - 1;
            foreach (GridViewRow row in this.grvData.Rows)
            {
                int count = columns;
                TextBox tbName = row.Cells[1].FindControl("txtName") as TextBox;
                TextBox tbLastName = row.Cells[2].FindControl("txtLastName") as TextBox;
                if (!string.IsNullOrWhiteSpace(tbName.Text))
                {
                    count--;
                }
                if (!string.IsNullOrWhiteSpace(tbLastName.Text))
                {
                    count--;
                }
                if (count != columns && count != 0)
                {
                    this.lblMessage.Text = "Invalid input, you need to supply data for every field.";
                    break;
                }
            }
        }

        private List<MyEntity> GenerateData()
        {
            List<MyEntity> list = new List<MyEntity>();
            for (int i = 0; i < 5; i++)
            {
                MyEntity entity = new MyEntity() { ID = Guid.NewGuid().ToString() };
                list.Add(entity);
            }
            return list;
        }
    }

ご覧のとおり、非常に単純です。パフォーマンスに影響を与える可能性があるため、多数の列を含むレコードをロードする場合は、このアプローチを使用することはお勧めしませんが、あなたの場合はこれでうまくいくと思います。

PS。私の答えはビジュアルC#です。なぜなら、私がそれを読んだとき、あなたは言語について言及していなかったので、今はそれを変更しただけだからです。

于 2012-11-04T03:45:26.440 に答える
0

DataGridViewコントロールのCellValidatingまたはRowValidatingイベントを使用して、ユーザーが入力したデータを検証します。

Private Sub OnRowValidating(ByVal sender As Object, ByVal args As DataGridViewCellCancelEventArgs) Handles DataGridView1.RowValidating
  Dim row As DataGridViewRow = DataGridView1.Rows(args.RowIndex)
  For Each cell As DataGridViewCell In row.Cells
     If String.IsNullOrEmpty(cell.Value.ToString()) Then
        'show a message box or whatever...
     End If
  Next
End Sub
于 2012-11-04T04:01:27.883 に答える